zoukankan      html  css  js  c++  java
  • Direct2D (41) : 文本命中测试 IDWriteTextLayout.HitTestPoint()


    uses Direct2D, D2D1;
    
    var iTextLayout: IDWriteTextLayout;
    
    {构建 DWRITE_TEXT_RANGE 结构的函数}
    function DWriteTextRange(pos,len: Cardinal): TDwriteTextRange;
    begin
      Result.startPosition := pos;
      Result.length := len;
    end;
    
    {建立 IDWriteTextLayout}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      str: string;
      iTextFormat: IDWriteTextFormat;
    begin
      str := 'Click on this text.';
      DWriteFactory.CreateTextFormat(
        'Verdana',
        nil,
        DWRITE_FONT_WEIGHT_REGULAR,
        DWRITE_FONT_STYLE_NORMAL,
        DWRITE_FONT_STRETCH_NORMAL,
        48.0,
        'en-us',
        iTextFormat
      );
      iTextFormat.SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);
      iTextFormat.SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
    
      DWriteFactory.CreateTextLayout(
        PWideChar(str),
        Length(str),
        iTextFormat,
        ClientWidth,
        ClientHeight,
        iTextLayout
      );
    end;
    
    {命中测试}
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    var
      bTrailingHit, bInside: BOOL;
      rTestMetrics: TDWriteHitTestMetrics;
    begin
      iTextLayout.HitTestPoint(
        X, Y,         //给出位置
        bTrailingHit, //输出布尔值, 表示当前位置是在命中区域的前端还是后端
        bInside,      //输出布尔值, 表示当前位置是在命中区域的内部还是外部
        rTestMetrics  //命中区域的信息结构
      );
      iTextLayout.SetUnderline(False, DWriteTextRange(0, MaxInt));                   //全部取消下划线
      iTextLayout.SetUnderline(True, DWriteTextRange(rTestMetrics.textPosition, 1)); //给命中的区域添加下划线
    //  Text := Format('TrailingHit: %d, Inside: %d', [Integer(bTrailingHit), Integer(bInside)]);
      Repaint;
    end;
    
    {使用 RenderTarget.DrawTextLayout() 方法绘制文本}
    procedure TForm1.FormPaint(Sender: TObject);
    var
      cvs: TDirect2DCanvas;
      iBrush: ID2D1SolidColorBrush;
    begin
      cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
      cvs.RenderTarget.BeginDraw;
      cvs.RenderTarget.Clear(D2D1ColorF(clWhite));
      cvs.RenderTarget.CreateSolidColorBrush(D2D1ColorF(clBlack), nil, iBrush);
      cvs.RenderTarget.DrawTextLayout(D2D1PointF(0,0), iTextLayout, iBrush);
      cvs.RenderTarget.EndDraw();
      cvs.Free;
    end;
    
    {刷新数据及重绘}
    procedure TForm1.FormResize(Sender: TObject);
    begin
      FormCreate(nil);
      Repaint;
    end;
    


    效果图:



  • 相关阅读:
    三点定位
    vue中使用UEditor编辑器 -- 2
    网络编程——socket编程
    异常处理
    面向对象进阶
    初识面向对象,面向对象之继承、多态和封装
    Python常用的模块
    函数递归,匿名、内置行数,模块和包,开发规范
    闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式
    Python基础学习——文件操作、函数
  • 原文地址:https://www.cnblogs.com/del/p/2016333.html
Copyright © 2011-2022 走看看