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;
    


    效果图:



  • 相关阅读:
    servlet上传图片 服务器路径(转)
    图片和提交servlet的相对和绝对路径
    Intel 的面试经历中国研究院
    CentOS-6.5-x86_64 最小化安装,已安装包的总数,这些包?
    西门子PLC学习笔记8-(计时器)
    这个周末我太累了
    windows7股票的,win8残疾人,安装Han澳大利亚sinoxn个时间,sinox它支持大多数windows软体
    net.sf.json 迄今 时刻 格式 办法
    ar命令提取.a时刻,一个错误 is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
    POJ 2187: Beauty Contest(旋转卡)
  • 原文地址:https://www.cnblogs.com/del/p/2016333.html
Copyright © 2011-2022 走看看