文档章节

Direct2D (36) : RenderTarget.DrawText() 与 IDWriteTextFormat

涂孟超
 涂孟超
发布于 2014/09/26 15:31
字数 951
阅读 17
收藏 0

TDirect2DCanvas 提供了两种输出文本的方法:TextOut()、TextRect(),因太过高级,基本没有实用价值。

TDirect2DCanvas.RenderTarget 有三种输出文本的方法:DrawText()、DrawTextLayout()、DrawGlyphRun()。
DrawText() 对文本格式的控制能力类似 TMemo;
DrawTextLayout() 对文本格式的控制能力类似 TRichEdit;
DrawGlyphRun() 可以完成更复杂的字形输出。
另外 DirectWrite 还有其它文本输出方法,如回调 IDWriteTextRenderer 接口。

TDirect2DCanvas 的 TextOut()、TextRect() 都是简单调用了 TDirect2DCanvas.RenderTarget.DrawTextLayout(),
TDirect2DCanvas.RenderTarget.DrawText() 在 Direct2D.pas 中并没有出现。

使用 TDirect2DCanvas.RenderTarget.DrawText() 主要就是通过 IDWriteTextFormat 设置文本格式。

procedure DrawText(
  &string: PWCHAR;                          //文本
  stringLength: UINT;                       //文本长度
  const textFormat: IDWriteTextFormat;      //文本格式
  const layoutRect: D2D1_RECT_F;            //布局矩形
  const defaultForegroundBrush: ID2D1Brush; //前景画刷
  options: TD2D1DrawTextOptions;            //见下(参数6);默认值 D2D1_DRAW_TEXT_OPTIONS_NONE;
  measuringMode: TDWriteMeasuringMode       //见下(参数7);默认值 DWRITE_MEASURING_MODE_NATURAL
); stdcall;

{参数6}
options: TD2D1DrawTextOptions {指定是禁用文本对齐还是启用剪切到布局矩形,可使用按位组合值}
D2D1_DRAW_TEXT_OPTIONS_NO_SNAP = 1; //文本不垂直对齐到像素边界。建议对要进行动画处理的文本采用此设置。
D2D1_DRAW_TEXT_OPTIONS_CLIP    = 2; //文本剪切到布局矩形。
D2D1_DRAW_TEXT_OPTIONS_NONE    = 0; //文本垂直对齐到像素边界,但是不剪切到布局矩形。

{参数7}
measuringMode: TDWriteMeasuringMode {指示用于文本布局的度量方法}
DWRITE_MEASURING_MODE_NATURAL     = 0; //指定使用字符理想度量(其值与当前显示分辨率无关)对文本进行度量。
DWRITE_MEASURING_MODE_GDI_CLASSIC = 1; //指定使用与字符显示兼容的度量(其值针对当前显示分辨率进行了优化)对文本进行度量。
DWRITE_MEASURING_MODE_GDI_NATURAL = 2; //指定使用与 GDI 文本度量(使用通过 CLEARTYPE_NATURAL_QUALITY 创建的字体)相同的字符显示度量对文本进行度量。


{IDWriteTextFormat 接口的方法}
IDWriteTextFormat.GetFlowDirection        //获取文本行的排列方向。
IDWriteTextFormat.GetFontCollection       //获取当前字体集合。
IDWriteTextFormat.GetFontFamilyName       //获取字体系列名称的副本。
IDWriteTextFormat.GetFontFamilyNameLength //获取字体系列名称的长度。
IDWriteTextFormat.GetFontSize             //获取字体高度(以 em 单位)。
IDWriteTextFormat.GetFontStretch          //获取文本的字体拉伸方式。
IDWriteTextFormat.GetFontStyle            //获取文本的字体样式
IDWriteTextFormat.GetFontWeight           //获取文本的字体粗细
IDWriteTextFormat.GetIncrementalTabStop   //获取增量制表位的位置
IDWriteTextFormat.GetLineSpacing          //获取多行文本段落的行距调整设置
IDWriteTextFormat.GetLocaleName           //获取文本中区域设置名称的副本
IDWriteTextFormat.GetLocaleNameLength     //获取文本中区域设置名称的长度
IDWriteTextFormat.GetParagraphAlignment   //获取相对于布局框的顶部边缘和底部边缘的段落对齐选项
IDWriteTextFormat.GetReadingDirection     //获取段落中文本的当前读取方向
IDWriteTextFormat.GetTextAlignment        //获取相对于布局框的前端边缘和后端边缘的文本对齐选项
IDWriteTextFormat.GetTrimming             //获取溢出布局框的文本的剪裁选项
IDWriteTextFormat.GetWordWrapping         //获取自动换行选项
IDWriteTextFormat.SetFlowDirection        //设置段落排列方向
IDWriteTextFormat.SetIncrementalTabStop   //设置两个相邻制表位之间的固定距离
IDWriteTextFormat.SetLineSpacing          //设置行距
IDWriteTextFormat.SetParagraphAlignment   //设置相对于布局框的顶部边缘和底部边缘的段落对齐选项
IDWriteTextFormat.SetReadingDirection     //设置段落读取方向
IDWriteTextFormat.SetTextAlignment        //设置段落中文本的对齐选项(相对于布局框的前端边缘和后端边缘)
IDWriteTextFormat.SetTrimming             //设置溢出布局宽度的文本的剪裁选项
IDWriteTextFormat.SetWordWrapping         //设置自动换行选项


测试代码:

uses Direct2D, D2D1;

procedure TForm1.FormPaint(Sender: TObject);
var
  cvs: TDirect2DCanvas;
  str: string;
  iTextFormat: IDWriteTextFormat;
  iSolidColorBrush: ID2D1SolidColorBrush;
begin
  str := 'Hello World using DirectWrite!';

  {建立 IDWriteTextFormat 对象}
  DWriteFactory.CreateTextFormat(
    'Arial Black',              //字体名称
    nil,                        //字体集合指针, nil 表示使用系统字体集合
    DWRITE_FONT_WEIGHT_NORMAL,  //字体粗细
    DWRITE_FONT_STYLE_NORMAL,   //字体样式
    DWRITE_FONT_STRETCH_NORMAL, //字体拉伸
    48.0,                       //字体逻辑大小, 单位 DIP(1/96英寸)
    'en-us',                    //区域名称, 如 zh-CN
    iTextFormat                 //输出 IDWriteTextFormat 接口对象
  );
  iTextFormat.SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);           //水平居中
  iTextFormat.SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER); //段落居中

  cvs := TDirect2DCanvas.Create(Canvas, ClientRect);
  cvs.RenderTarget.CreateSolidColorBrush(D2D1ColorF(clRed), nil, iSolidColorBrush);
  cvs.RenderTarget.BeginDraw;
  cvs.RenderTarget.Clear(D2D1ColorF(clWhite));
  cvs.RenderTarget.DrawText(PWideChar(str), Length(str), iTextFormat, ClientRect, iSolidColorBrush);
  cvs.RenderTarget.EndDraw();
  cvs.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Repaint;
end;


效果图:




调整 DWriteFactory.CreateTextFormat() 个别参数的效果:





本文转载自:http://www.cnblogs.com/del/archive/2011/04/12/2014129.html

涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
Direct2D教程(十)绘制文本

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

吞吞吐吐的
2017/10/17
0
0
关于Direct3D11里汉字显示的一些思考

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/8147234 作者:毛星云 邮箱: happylifemxy@163.com 这篇文章里,浅墨希望与大家一起...

长平狐
2012/11/12
858
0
Direct2D 学习笔记(1)

Direct2D 应用程序接口概述 资源网站https://docs.microsoft.com/en-us/windows/win32/Direct2D/the-direct2d-api 主要用到的头文件是:d2d1.h 编译时需要连接文件:d2d1.lib Direct2D接口的...

Halation
09/27
0
0
Direct2D 学习笔记 前言

Direct2D模板程序网址:https://docs.microsoft.com/zh-cn/windows/win32/direct2d/direct2d-quickstart DirectX SDK下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=......

Halation
09/24
0
0
使用 Direct2D 绘制分层窗口

这是我关于Direct2D的第三篇介绍了,今天主要讲下其无可比拟的互操作性。为了避免繁缛末节的讲述,我们从一个实例入手:层级窗口。相对于windows的其它众多功能。层级窗口并未做相应的更新,...

Dy_
2014/01/16
8.6K
10

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部