Direct2D (38) : RenderTarget.DrawTextLayout() 与 IDWriteTextLayout

2023-10-18 18:20

本文主要是介绍Direct2D (38) : RenderTarget.DrawTextLayout() 与 IDWriteTextLayout,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么80%的码农都做不了架构师?>>>   hot3.png


使用 RenderTarget.DrawTextLayout() 方法主要是设置 IDWriteTextLayout 接口;
构建 IDWriteTextLayout 接口需要 IDWriteTextFormat 接口。

IDWriteTextLayout 接口是经过完全分析和格式化后的文本块。

{RenderTarget.DrawTextLayout() 方法}
procedure DrawTextLayout(origin: D2D1_POINT_2F;                    //起点const textLayout: IDWriteTextLayout;      //分析和格式化后的文本块const defaultForegroundBrush: ID2D1Brush; //前景画刷options: TD2D1DrawTextOptions             //见下(参数4);默认值 D2D1_DRAW_TEXT_OPTIONS_NONE
); stdcall;{参数4}
options: TD2D1DrawTextOptions {指定是禁用文本对齐还是启用剪切到布局矩形, 可使用按位组合值}
D2D1_DRAW_TEXT_OPTIONS_NO_SNAP = 1; //文本不垂直对齐到像素边界。建议对要进行动画处理的文本采用此设置。
D2D1_DRAW_TEXT_OPTIONS_CLIP    = 2; //文本剪切到布局矩形。
D2D1_DRAW_TEXT_OPTIONS_NONE    = 0; //文本垂直对齐到像素边界,但是不剪切到布局矩形。{IDWriteTextLayout 接口提供的方法}
IDWriteTextLayout.Draw                     //使用指定的客户端绘制上下文绘制文本
IDWriteTextLayout.GetClusterMetrics        //检索每个字形群集的逻辑属性和度量
IDWriteTextLayout.DetermineMinWidth        //确定在整个词的各字符之间不断开的前提下可以为布局设置的最小宽度
IDWriteTextLayout.GetDrawingEffect         //获取在指定文本位置处应用程序定义的绘制效果
IDWriteTextLayout.GetFontCollection        //获取与指定位置处的文本关联的字体集合
IDWriteTextLayout.GetFontFamilyName        //复制指定位置处文本的字体系列名称
IDWriteTextLayout.GetFontFamilyNameLength  //获取当前位置处的字体系列名称的长度
IDWriteTextLayout.GetFontSize              //获取指定位置处文本的字体高度(以 em 为单位)
IDWriteTextLayout.GetFontStretch           //获取指定位置处文本的字体拉伸方式
IDWriteTextLayout.GetFontStyle             //获取指定位置处文本的字体样式(也称作斜度)
IDWriteTextLayout.GetFontWeight            //获取指定位置处文本的字体粗细
IDWriteTextLayout.GetInlineObject          //获取给定位置处的嵌入式对象
IDWriteTextLayout.GetLineMetrics           //检索文本字符串的每一文本行的相关信息
IDWriteTextLayout.GetLocaleName            //获取指定位置处文本的区域设置名称
IDWriteTextLayout.GetLocaleNameLength      //获取指定位置处文本的区域设置名称的长度
IDWriteTextLayout.GetMaxHeight             //获取布局最大高度
IDWriteTextLayout.GetMaxWidth              //获取布局最大宽度
IDWriteTextLayout.GetMetrics               //检索格式化后的字符串的总体度量
IDWriteTextLayout.GetOverhangMetrics       //返回布局及其包含的所有对象(包括文本字形和嵌入式对象)的延伸量(以与设备无关的像素(DIP)为单位)
IDWriteTextLayout.GetStrikethrough         //获取指定位置处文本中存在的删除线
IDWriteTextLayout.GetTypography            //获取指定位置处文本的版式设置
IDWriteTextLayout.GetUnderline             //获取指定位置处文本中存在的下划线
IDWriteTextLayout.HitTestPoint             //获取布局框中指定点的 DWRITE_HIT_TEST_METRICS 结构; 它还报告该点是否在由文本布局表示的文本字符串内
IDWriteTextLayout.HitTestTextPosition      //获取相对于布局框左上角的指定文本的位置以及包含围绕该文本位置的输出几何图形的 DWRITE_HIT_TEST_METRICS 结构
IDWriteTextLayout.HitTestTextRange         //在给定起始文本位置和文本长度的情况下, 获取指定文本位置的 DWRITE_HIT_TEST_METRICS 结构
IDWriteTextLayout.SetDrawingEffect         //设置应用程序定义的绘制效果
IDWriteTextLayout.SetFontCollection        //设置字体集合
IDWriteTextLayout.SetFontFamilyName        //为指定文本范围内的文本设置以 Null 结尾的字体系列名称
IDWriteTextLayout.SetFontSize              //设置指定文本范围内文本的字体高度(以 em 为单位)
IDWriteTextLayout.SetFontStretch           //设置指定文本范围内文本的字体拉伸方式
IDWriteTextLayout.SetFontStyle             //设置指定文本范围内文本的字体样式
IDWriteTextLayout.SetFontWeight            //设置指定文本范围内文本的字体粗细
IDWriteTextLayout.SetInlineObject          //设置嵌入式对象
IDWriteTextLayout.SetLocaleName            //设置指定文本范围内文本的区域设置名称
IDWriteTextLayout.SetMaxHeight             //设置布局最大高度
IDWriteTextLayout.SetMaxWidth              //设置布局最大宽度
IDWriteTextLayout.SetStrikethrough         //为指定文本范围内的文本设置删除线
IDWriteTextLayout.SetTypography            //为指定文本范围内的文本设置字体版式功能
IDWriteTextLayout.SetUnderline             //为指定文本范围内的文本设置下划线


测试代码:

uses Direct2D, D2D1;{构建 DWRITE_TEXT_RANGE 结构的函数}
function DWriteTextRange(pos,len: Cardinal): TDwriteTextRange;
beginResult.startPosition := pos;Result.length := len;
end;{构建 DWRITE_FONT_FEATURE 结构的函数}
function DWriteFontFeature(nameTag: Integer; parameter: Cardinal): TDwriteFontFeature;
beginResult.nameTag := nameTag;Result.parameter := parameter; //选择器索引, 0 表示禁用
end;procedure TForm1.FormPaint(Sender: TObject);
varcvs: TDirect2DCanvas;str: string;iTextFormat: IDWriteTextFormat;iSolidColorBrush: ID2D1SolidColorBrush;iTextLayout: IDWriteTextLayout;iTypography: IDWriteTypography;
beginstr := 'Hello World using DirectWrite!';{建立 IDWriteTextFormat}DWriteFactory.CreateTextFormat('Gabriola', //Gabriola 是 Win7 的新字体nil,DWRITE_FONT_WEIGHT_REGULAR,DWRITE_FONT_STYLE_NORMAL,DWRITE_FONT_STRETCH_NORMAL,72.0,'en-us',iTextFormat);iTextFormat.SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);iTextFormat.SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);{建立 IDWriteTextLayout}DWriteFactory.CreateTextLayout(PWideChar(str), //文本Length(str),    //文本长度iTextFormat,    //IDWriteTextFormat 接口ClientWidth,    //宽度ClientHeight,   //高度iTextLayout     //输出 IDWriteTextLayout);{设置部分文本的字号、下划线、粗体}iTextLayout.SetFontSize(100.0, DWriteTextRange(18, 6)); //指定从 18 个字符起的 6 个字符的大小为 100iTextLayout.SetUnderline(True, DWriteTextRange(18, 11));iTextLayout.SetFontWeight(DWRITE_FONT_WEIGHT_BOLD, DWriteTextRange(18, 11));{设置不同的花式变体, 只对支持该功能的字体(如 Gabriola)有效}DWriteFactory.CreateTypography(iTypography);iTypography.AddFontFeature(DWriteFontFeature(DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7, 1));iTextLayout.SetTypography(iTypography, DWriteTextRange(0, Length(str)));cvs := TDirect2DCanvas.Create(Canvas, ClientRect);cvs.RenderTarget.CreateSolidColorBrush(D2D1ColorF(clGreen), nil, iSolidColorBrush);cvs.RenderTarget.BeginDraw;cvs.RenderTarget.Clear(D2D1ColorF(clWhite));cvs.RenderTarget.DrawTextLayout(D2D1PointF(0,0), iTextLayout, iSolidColorBrush);cvs.RenderTarget.EndDraw();cvs.Free;
end;procedure TForm1.FormResize(Sender: TObject);
beginRepaint;
end;


效果图:

26153927_1dyK.png

测试其它字体和其它花式的程序: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ComboBox1: TComboBox; ComboBox2: TComboBox; procedure FormPaint(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses Direct2D, D2D1; const list = 'DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS ,' + 'DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS ,' + 'DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS ,' + 'DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES ,' + 'DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION ,' + 'DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES ,' + 'DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING ,' + 'DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH ,' + 'DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING ,' + 'DWRITE_FONT_FEATURE_TAG_DEFAULT ,' + 'DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES ,' + 'DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_FRACTIONS ,' + 'DWRITE_FONT_FEATURE_TAG_FULL_WIDTH ,' + 'DWRITE_FONT_FEATURE_TAG_HALF_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_HALANT_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH ,' + 'DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES ,' + 'DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES ,' + 'DWRITE_FONT_FEATURE_TAG_HALF_WIDTH ,' + 'DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_JIS04_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_JIS78_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_JIS83_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_JIS90_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_KERNING ,' + 'DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES ,' + 'DWRITE_FONT_FEATURE_TAG_LINING_FIGURES ,' + 'DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING ,' + 'DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK ,' + 'DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING ,' + 'DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES ,' + 'DWRITE_FONT_FEATURE_TAG_ORDINALS ,' + 'DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH ,' + 'DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS ,' + 'DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES ,' + 'DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS ,' + 'DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS ,' + 'DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES ,' + 'DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES ,' + 'DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS ,' + 'DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS ,' + 'DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19 ,' + 'DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 ,' + 'DWRITE_FONT_FEATURE_TAG_SUBSCRIPT ,' + 'DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT ,' + 'DWRITE_FONT_FEATURE_TAG_SWASH ,' + 'DWRITE_FONT_FEATURE_TAG_TITLING ,' + 'DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES ,' + 'DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS ,' + 'DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS ,' + 'DWRITE_FONT_FEATURE_TAG_UNICASE ,' + 'DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO '; var arrFeatureTag: array[0..78] of Integer = ( DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS , DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS , DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS , DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES , DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS , DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION , DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES , DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING , DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH , DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING , DWRITE_FONT_FEATURE_TAG_DEFAULT , DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES , DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS , DWRITE_FONT_FEATURE_TAG_FRACTIONS , DWRITE_FONT_FEATURE_TAG_FULL_WIDTH , DWRITE_FONT_FEATURE_TAG_HALF_FORMS , DWRITE_FONT_FEATURE_TAG_HALANT_FORMS , DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH , DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS , DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES , DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES , DWRITE_FONT_FEATURE_TAG_HALF_WIDTH , DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS , DWRITE_FONT_FEATURE_TAG_JIS04_FORMS , DWRITE_FONT_FEATURE_TAG_JIS78_FORMS , DWRITE_FONT_FEATURE_TAG_JIS83_FORMS , DWRITE_FONT_FEATURE_TAG_JIS90_FORMS , DWRITE_FONT_FEATURE_TAG_KERNING , DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES , DWRITE_FONT_FEATURE_TAG_LINING_FIGURES , DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS , DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING , DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK , DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING , DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS , DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS , DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES , DWRITE_FONT_FEATURE_TAG_ORDINALS , DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH , DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS , DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES , DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS , DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS , DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES , DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS , DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES , DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS , DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS , DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19 , DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 , DWRITE_FONT_FEATURE_TAG_SUBSCRIPT , DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT , DWRITE_FONT_FEATURE_TAG_SWASH , DWRITE_FONT_FEATURE_TAG_TITLING , DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS , DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES , DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS , DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS , DWRITE_FONT_FEATURE_TAG_UNICASE , DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO ); {构建 DWRITE_TEXT_RANGE 结构的函数} function DWriteTextRange(pos,len: Cardinal): TDwriteTextRange; begin Result.startPosition := pos; Result.length := len; end; {构建 DWRITE_FONT_FEATURE 结构的函数} function DWriteFontFeature(nameTag: Integer; parameter: Cardinal): TDwriteFontFeature; begin Result.nameTag := nameTag; Result.parameter := parameter; //选择器索引, 0 表示禁用 end; procedure TForm1.FormCreate(Sender: TObject); begin ComboBox1.Align := alTop; ComboBox1.Items := Screen.Fonts; ComboBox1.Text := 'Gabriola'; ComboBox1.OnChange := OnPaint; ComboBox2.Align := alTop; ComboBox2.Items.CommaText := list; ComboBox2.ItemIndex := 55; ComboBox2.OnChange := OnPaint; end; procedure TForm1.FormPaint(Sender: TObject); var cvs: TDirect2DCanvas; str: string; iTextFormat: IDWriteTextFormat; iSolidColorBrush: ID2D1SolidColorBrush; iTextLayout: IDWriteTextLayout; iTypography: IDWriteTypography; begin str := 'Hello World using DirectWrite!'; DWriteFactory.CreateTextFormat( PWideChar(ComboBox1.Text), //Gabriola nil, DWRITE_FONT_WEIGHT_REGULAR, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 72.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 ); iTextLayout.SetFontSize(100.0, DWriteTextRange(18, 6)); iTextLayout.SetUnderline(True, DWriteTextRange(18, 11)); iTextLayout.SetFontWeight(DWRITE_FONT_WEIGHT_BOLD, DWriteTextRange(18, 11)); DWriteFactory.CreateTypography(iTypography); iTypography.AddFontFeature(DWriteFontFeature(arrFeatureTag[ComboBox2.ItemIndex], 1)); iTextLayout.SetTypography(iTypography, DWriteTextRange(0, Length(str))); cvs := TDirect2DCanvas.Create(Canvas, ClientRect); cvs.RenderTarget.CreateSolidColorBrush(D2D1ColorF(clBlack), nil, iSolidColorBrush); cvs.RenderTarget.BeginDraw; cvs.RenderTarget.Clear(D2D1ColorF(clWhite)); cvs.RenderTarget.DrawTextLayout(D2D1PointF(0,0), iTextLayout, iSolidColorBrush); cvs.RenderTarget.EndDraw(); cvs.Free; end; procedure TForm1.FormResize(Sender: TObject); begin Repaint; end; end.

转载于:https://my.oschina.net/hermer/blog/320828

这篇关于Direct2D (38) : RenderTarget.DrawTextLayout() 与 IDWriteTextLayout的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234356

相关文章

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

leetcode#38. Count and Say

The count-and-say sequence is the sequence of integers with the first five terms as following: 1. 12. 113. 214. 12115. 111221 1 is read off as “one 1” or 11. 11 is read off

2024国赛数学建模B题完整分析参考论文38页(含模型和可运行代码)

2024 高教社杯全国大学生数学建模完整分析参考论文 B 题 生产过程中的决策问题 目录 摘要 一、问题重述 二、问题分析 三、 模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.1.4问题1样例代码运行结果(仅供参考) 4.2问题2 4.2.1问题2思路分析 4.2.2问题2模

数据库系统 第38节 数据库备份

数据库备份是确保数据安全和完整性的重要手段。它涉及创建数据库的副本,以便在数据丢失或损坏的情况下可以恢复。数据库备份可以采取多种形式,包括完全备份、增量备份和差异备份。下面将详细说明每种备份类型,并提供相应的源代码示例。 1. 完全备份 完全备份是数据库的完整副本,包括所有数据和数据库对象(如表、索引、视图等)。这种备份通常用于初始备份或在长时间间隔后进行备份。 示例代码(Python):

LeetCode - 38. Count and Say

38. Count and Say  Problem's Link  ---------------------------------------------------------------------------- Mean:  题目意思太晦涩。 1 读出来 就是“1个1” 所以记为“11” 11 读出来 就是“2个1” 所以记为“21” 21 读出来 就是“1个

【软件逆向】第38课,软件逆向安全工程师之操作标志寄存器实例,每天5分钟学习逆向吧!

在这些实例学习中,我们使用汇编指令来操作标志寄存器,并根据标志寄存器的状态进行条件分支。这些操作对于编写高效的汇编程序以及理解程序的行为至关重要 实例 1:使用 PUSHF 和 POPF 保存和恢复标志寄存器状态 section .text global _start _start: ; 初始化 AL 寄存器 MOV AL, 0xFF ; 对 AL 寄存器进行加一操作,这将导致 AL 寄存器的

Java38: 数据库二(Oracle)

group by 分组 --每个工作的人数select count(job) from emp group by job;--有多少工作select count(coutn(job)) from emp group by job;--每个工作的最高工资select max(sal) from emp group by job;--每个工作的最低工资select min(sal

C++系列——Direct2D进行图片处理

C++系列——Direct2D图片处理 01 前言 图片处理工具多如牛毛了,自不必说。主要是应对需要批量处理的场景,所以不如手搓。已经试过直接用C#封装好的库System.Drawing,挺好的,就是过了一段时间感觉这速度有点受不了。于是转用C++,结合GDI+又手搓了一个。因为部分代码与C#版本类似(C#底层用的还是GDI),很快也搞好了。 嗯~~ 这下舒服了。随着效率的提高,我以为可以快乐

38集 ESP32 离线刷机教程

38集 ESP32 离线刷机教程 打开离线刷机工具 e:\technology\ESP32\esp32s3Qorvo\esp32-s3_rtc\ESP离线刷机\flash_download_tool_3.9.7_1\flash_download_tool_3.9.7\flash_download_tool_3.9.7.exe 设置如下: 要知道如何设置,需要知道esp32s3 工程的memor

云计算实训38——docker网络、跨主机容器之间的通讯

一、docker⽹络 1.桥接--bridge 所有容器连接到桥就可以使⽤外⽹,使⽤nat让容器可以访问外⽹ 使⽤ ip a s指令查看桥,所有容器连接到此桥,ip地址都是 172.17.0.0/16 ⽹段,桥是启动docker服务后出现,在centos使⽤ bridge-utils安装 1.下载bridge-utilsyum -y install bridge-utils.x86_