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;
效果图:

分类:
Direct2D
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2010-04-14 如何在数据表中存取图片 - 回复 "三足乌" 的问题
2010-04-14 学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
2010-04-14 学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX
2009-04-14 把 Integer 数组保存到文件、并读取
2009-04-14 从字符串中提取单词、从字符串中提取汉字的函数