您的位置:首页 > 产品设计 > UI/UE

Duilib 源码分析之 文字样式(m_uTextStyle) 篇

2017-12-19 17:28 816 查看
本帖基于的 Duilib 版本为 “Duilib 开源项目圈2群” 中下载的版本。

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 在多行显示的情况下,对于最后一行,若显示不全,则不显示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  控件 开源项目 源码