文档章节

Direct2D (41) : 文本命中测试 - IDWriteTextLayout.HitTestPoint()

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 266
阅读 20
收藏 0
点赞 0
评论 0

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;


效果图:



© 著作权归作者所有

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
Direct2D教程(十)绘制文本

概述 在Direct2D中,文本的绘制是通过DirectWrite来实现的,DirectWrite实际上已经是一个独立的DirectX组件了。关于DirectWrite,我摘录了MSDN的一段文字。 DirectWrite介绍 当今的应用程序应...

吞吞吐吐的 ⋅ 2017/10/17 ⋅ 0

Windows桌面应用程序(1-2-4-7th) DPI和设备无关的像素

要使用Windows图形进行有效编程,您必须了解两个相关的概念: 每英寸点数(DPI) 设备无关像素(DIP)。 我们从DPI开始。这将需要短暂的绕行排版。在印刷术中,类型的大小以称为点的单位来测量。一点...

qq_37422196 ⋅ 01/12 ⋅ 0

硬件加速:浏览器大战的新前沿

硬件加速:浏览器大战的新前沿 作者:Frederic Lardinois / 2009年11月24日 9:04AM 微软在本月初召开的专业开发者大会(Professional Developers Conference)上宣布了其最新的IE9计划,微软在...

老枪 ⋅ 2009/11/26 ⋅ 0

WPF 使用 Direct2D1 画图 绘制基本图形

本文来告诉大家如何在 Direct2D1 绘制基本图形,包括线段、矩形、椭圆 本文是一个系列 WPF 使用 Direct2D1 画图入门 WPF 使用 Direct2D1 画图 绘制基本图形 本文的组织参考Direct2D,对大神表...

lindexi_gd ⋅ 04/19 ⋅ 0

IE9初窥:支持CSS3,和HTML5?

微软昨天在其2009年专业开发者大会上展示了下一个版本的Internet Explorer浏览器IE9。 尽管只是一个早期版本,IE开发团队还是比较高调的宣布了IE9的一些改进,比如速度比之前的IE版本都更快些...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

FireFox开发版本加入GPU加速文字渲染

全球第二大浏览器厂商FireFox在最近的nightlyBuilds 中加入了一项令人激动的功能——GPU加速网页文字渲染。通过该功能,不仅仅可以大幅度提升网页上文字渲染的速度,还可以让字体更加美观、平...

小编辑 ⋅ 2010/03/03 ⋅ 0

深度解读 - Windows 7核心图形架构细致分析(转贴)

原帖地址:http://technet.microsoft.com/zh-cn/library/ee921514.aspx 如现在大家所想的那样, Windows7 其实是 Windows Vista 的改进版。 Windows 7 在 Windows Vista 的基础上进行了大量的...

迈克老狼1 ⋅ 2012/12/23 ⋅ 0

USB启动盘制作软件--iBurnMgr

iBurnMgr是一款基于Direct2D DirectWrite开发的USB启动盘制作软件,采用流行的扁平风格,使用原生C++开发,不依赖任何第三方库,USB启动盘制作过程使用多线程技术,制作过程可以中途终止,界...

Force武装卫队 ⋅ 2014/06/18 ⋅ 4

Wine 1.7.49 发布,更多的 OpenMP 函数

Wine 1.7.49 发布,此版本更新内容如下: DirectWrite 可以很好的在 Steam 渲染文本 大量 Direct2D 改进 更多的 OpenMP 函数 支持 IDL 编译器的命名空间 各种 bug 修复 此版本源代码现已提供...

oschina ⋅ 2015/08/08 ⋅ 5

APP 验证码 采用MEMCAHED验证的坑

都知道APP不是用浏览器来的,所以验证码生成session cookie是行不通了。 一开始APP进入验证码界面,先让他请求一次服务器,生成key:code返回去。再把拿到的KEY带到服务器上面去生成图片。同时...

邻里 ⋅ 2016/10/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部