Duilib 源码分析之 文字样式(m_uTextStyle) 篇
2017-12-19 17:28
816 查看
本帖基于的 Duilib 版本为 “Duilib 开源项目圈2群” 中下载的版本。
Duilib 中的
文字对其相关样式
DT_TOP,通过 valign=”top” 控制,对应于 Gdiplus::StringFormat::SetLineAlignment(Gdiplus::StringAlignmentNear)
DT_VCENTER,通过 valign=”vcenter” 控制,对应于 Gdiplus::StringFormat::SetLineAlignment(Gdiplus::StringAlignmentCenter)
DT_BOTTOM,通过 valign=”bottom” 控制,对应于 Gdiplus::StringFormat::SetLineAlignment(Gdiplus::StringAlignmentFar)
DT_LEFT,通过 align=”left” 控制,对应于 Gdiplus::StringFormat::SetAlignment(Gdiplus::StringAlignmentNear)
DT_CENTER,通过 align=”center” 控制,对应于 Gdiplus::StringFormat::SetAlignment(Gdiplus::StringAlignmentCenter)
DT_RIGHT,通过 align=”right” 控制,对应于 Gdiplus::StringFormat::SetAlignment(Gdiplus::StringAlignmentFar)
以上对齐属性请注意,DT_TOP DT_BOTTOM 和 DT_VCENTER 需和 DT_SINGLELINE 配合使用,否则 GDI 则无法计算位置,从而使对齐方式无效
DT_WORDBREAK 通过 wordbreak=”true” 控制。支持换行,注意是 word break, 所以是按单词进行换行的,加入一个单词过长,则会整个单词换行,所以此时会在上一行末尾留一些空白。
DT_SINGLELINE 单行显示,若文字过长则会显示不全(除非设置了 DT_NOCLIP)。对应于 Gdiplus::StringFormatFlagsNoWrap
DT_NOCLIP 绘制文字时若给定的矩形区域宽度不够且设置了单行显示。或者即使设置了多行显示但高度不够,都会导致文字显示不全。 但若设置了此属性,文字就会绘制到矩形外面,不会出现显示不全的情况。 如果你确定你设置的大小不会超过给定的矩形,也可以加上此属性,根据 CSDN 中的描述 “DrawText is somewhat faster when DT_NOCLIP is used”, 加上此属性可以稍微提高绘制速度。 对应于 Gdiplus::StringFormatFlagsNoClip
DT_EXPANDTABS 此属性和 DT_TABSTOP 配合使用可以控制字符串中制表符所占字符大小,默认占8个字符,可以通过 DT_EXPANDTABS | DT_TABSTOP | size 来控制,其中 size 中的高 16 位代表占位大小。例如 size = 0x1000 时代表制表符占位 16 个字符。
DT_EXTERNALLEADING 在行的高度里包含字体的外部标头,通常,外部标头不被包含在正文行的高度里。关于外部标头相关内容,在Duilib 源码分析之字体篇 中曾有提及
DT_CALCRECT 计算文字绘制所需矩形大小。多行的情况下,会根据传入的矩形的宽度进行计算。若最长的单词宽度超过给定宽度,则扩展给定的宽度。传入的矩形宽度和传出的矩形大小都是通过
DT_NOPREFIX 通过 noprefix=”true” 控制。禁用 & 转义。 默认情况下,在字符前加个 & 会显示为 字符+下划线 的形式,&& 会转义为 &。 例如 “A&B&&C” 默认会绘制成 “AB&C” ,且在 B 字符下会有一个下划线 (此博客中的 MarkDown 编辑器好像不支持下划线 ??)。 若设置了此属性则会禁用转义。 字符下加下划线的形式经常用于快捷键字母+下划线的场合。
DT_HIDEPREFIX 禁用 & 的转义,但保留 && 的转义
DT_PREFIXONLY 只绘制通过 & 转义的下划线,其他的所有字符都不再绘制
DT_INTERNAL 用系统字体计算文字度量。一般情况下我们不会设置此属性。计算文字大小时会使用我们自定义的字体。
DT_END_ELLIPSIS 通过endellipsis=”true”控制。 当绘制矩形过小导致文字显示不全的情况,会在文字末尾加…
DT_PATH_ELLIPSIS 当路径字符串显示不全的情况下,可以设置此属性,会将路径中间部分字符串变成 … ,而显示首位两端部分字符串
DT_WORD_ELLIPSIS 截短不符合矩形的文字并加… 这个属性和 DT_END_ELLIPSIS 的区别是,对于多行显示,后者只在最后一行可能加 .. ,而前者可能在每一行需要的时候都会加上 …
DT_RTLREADING 当选择进设备环境的字体是 Hebrew(希伯来语) 或 Arabic(阿拉伯语) 时,为双向正文安排从右到左的阅读顺序。对于其他字体无效。这个字体应该不是指的 HFONT 所谓的字体,而是当前的系统环境字体
DT_MODIFYSTRING 和 DT_END_ELLIPSIS 或 DT_PATH_ELLIPSIS 配合使用,这个属性会修改原始字符串来匹配当前绘制显示在界面上的。例如 CString str = “This is a test string.” 我将绘制的矩形宽度设置为 100。 由于宽度不够,界面上显示的文字为 “This is a …”, 同时 str 中也被修改为 “This is a …”
DT_EDITCONTROL 在多行显示的情况下,对于最后一行,若显示不全,则不显示
Duilib 中的
CLabelUI等控件含有成员变量
m_uTextStyle,代表绘制文字时的绘制样式。现在来详细说明一下具体的样式类型。 未标明可通过 key=”value” 控制的代表这个版本中的 Duilib 不支持对应的样式控制。大家若使用到了具体的属性可以自己添加属性来实现。
文字对其相关样式
DT_TOP,通过 valign=”top” 控制,对应于 Gdiplus::StringFormat::SetLineAlignment(Gdiplus::StringAlignmentNear)
DT_VCENTER,通过 valign=”vcenter” 控制,对应于 Gdiplus::StringFormat::SetLineAlignment(Gdiplus::StringAlignmentCenter)
DT_BOTTOM,通过 valign=”bottom” 控制,对应于 Gdiplus::StringFormat::SetLineAlignment(Gdiplus::StringAlignmentFar)
DT_LEFT,通过 align=”left” 控制,对应于 Gdiplus::StringFormat::SetAlignment(Gdiplus::StringAlignmentNear)
DT_CENTER,通过 align=”center” 控制,对应于 Gdiplus::StringFormat::SetAlignment(Gdiplus::StringAlignmentCenter)
DT_RIGHT,通过 align=”right” 控制,对应于 Gdiplus::StringFormat::SetAlignment(Gdiplus::StringAlignmentFar)
以上对齐属性请注意,DT_TOP DT_BOTTOM 和 DT_VCENTER 需和 DT_SINGLELINE 配合使用,否则 GDI 则无法计算位置,从而使对齐方式无效
DT_WORDBREAK 通过 wordbreak=”true” 控制。支持换行,注意是 word break, 所以是按单词进行换行的,加入一个单词过长,则会整个单词换行,所以此时会在上一行末尾留一些空白。
DT_SINGLELINE 单行显示,若文字过长则会显示不全(除非设置了 DT_NOCLIP)。对应于 Gdiplus::StringFormatFlagsNoWrap
DT_NOCLIP 绘制文字时若给定的矩形区域宽度不够且设置了单行显示。或者即使设置了多行显示但高度不够,都会导致文字显示不全。 但若设置了此属性,文字就会绘制到矩形外面,不会出现显示不全的情况。 如果你确定你设置的大小不会超过给定的矩形,也可以加上此属性,根据 CSDN 中的描述 “DrawText is somewhat faster when DT_NOCLIP is used”, 加上此属性可以稍微提高绘制速度。 对应于 Gdiplus::StringFormatFlagsNoClip
DT_EXPANDTABS 此属性和 DT_TABSTOP 配合使用可以控制字符串中制表符所占字符大小,默认占8个字符,可以通过 DT_EXPANDTABS | DT_TABSTOP | size 来控制,其中 size 中的高 16 位代表占位大小。例如 size = 0x1000 时代表制表符占位 16 个字符。
DT_EXTERNALLEADING 在行的高度里包含字体的外部标头,通常,外部标头不被包含在正文行的高度里。关于外部标头相关内容,在Duilib 源码分析之字体篇 中曾有提及
DT_CALCRECT 计算文字绘制所需矩形大小。多行的情况下,会根据传入的矩形的宽度进行计算。若最长的单词宽度超过给定宽度,则扩展给定的宽度。传入的矩形宽度和传出的矩形大小都是通过
DrawText第 4 个参数实现。
DT_NOPREFIX 通过 noprefix=”true” 控制。禁用 & 转义。 默认情况下,在字符前加个 & 会显示为 字符+下划线 的形式,&& 会转义为 &。 例如 “A&B&&C” 默认会绘制成 “AB&C” ,且在 B 字符下会有一个下划线 (此博客中的 MarkDown 编辑器好像不支持下划线 ??)。 若设置了此属性则会禁用转义。 字符下加下划线的形式经常用于快捷键字母+下划线的场合。
DT_HIDEPREFIX 禁用 & 的转义,但保留 && 的转义
DT_PREFIXONLY 只绘制通过 & 转义的下划线,其他的所有字符都不再绘制
DT_INTERNAL 用系统字体计算文字度量。一般情况下我们不会设置此属性。计算文字大小时会使用我们自定义的字体。
DT_END_ELLIPSIS 通过endellipsis=”true”控制。 当绘制矩形过小导致文字显示不全的情况,会在文字末尾加…
DT_PATH_ELLIPSIS 当路径字符串显示不全的情况下,可以设置此属性,会将路径中间部分字符串变成 … ,而显示首位两端部分字符串
DT_WORD_ELLIPSIS 截短不符合矩形的文字并加… 这个属性和 DT_END_ELLIPSIS 的区别是,对于多行显示,后者只在最后一行可能加 .. ,而前者可能在每一行需要的时候都会加上 …
DT_RTLREADING 当选择进设备环境的字体是 Hebrew(希伯来语) 或 Arabic(阿拉伯语) 时,为双向正文安排从右到左的阅读顺序。对于其他字体无效。这个字体应该不是指的 HFONT 所谓的字体,而是当前的系统环境字体
DT_MODIFYSTRING 和 DT_END_ELLIPSIS 或 DT_PATH_ELLIPSIS 配合使用,这个属性会修改原始字符串来匹配当前绘制显示在界面上的。例如 CString str = “This is a test string.” 我将绘制的矩形宽度设置为 100。 由于宽度不够,界面上显示的文字为 “This is a …”, 同时 str 中也被修改为 “This is a …”
DT_EDITCONTROL 在多行显示的情况下,对于最后一行,若显示不全,则不显示
相关文章推荐
- Duilib 源码分析之 CRichEditUI 篇
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备四)
- jQuery源码分析-13 CSS操作-CSS-类样式-addClass+removeClass+toggleClass+hasClass
- Duilib源码分析(六)整体流程
- Duilib 源码分析之工具类 CDuiRect 篇
- Duilib 源码分析之消息流程篇
- [原创] jQuery源码分析-13 CSS操作-CSS-类样式-addClass+removeClass+toggleClass+hasClass
- DuiLib 源码分析——UIBase
- DuiLib的源码分析
- Duilib 源码分析之 ToolTip 篇
- Duilib源码分析(五)UI布局—Layout与各子控件
- DuiLib 源码分析——UIManager
- DUiLib 源码分析——第一篇UIManager
- 【转】jQuery源码分析-13 CSS操作-CSS-类样式-addClass+removeClass+toggleClass+hasClass
- Duilib源码 "类" 逻辑分析.
- DuiLib的源码分析
- DUiLib 源码分析——第二篇UIBase
- DUiLib 源码分析——第一篇UIManager
- Duilib 源码分析之 CLabelUI 篇
- DUiLib 源码分析——第二篇UIBase