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;
    


    效果图:



  • 相关阅读:
    关于销售订单状态(转载)
    SAP VA02 为销售订单添加附件
    销售订单行项目的装运点字段确认规则
    SAP 没有找到物料编号转换的设置
    ABAP动态 I TAB
    ABAP
    记住一个道理:只要自己变优秀了,其他的事情才会跟着好起来。
    《将博客搬至CSDN》
    Python3命名规范
    Linux下批量杀掉 包含某个关键字的 程序进程
  • 原文地址:https://www.cnblogs.com/del/p/2016333.html
Copyright © 2011-2022 走看看