Duilib 中的 CTextUI
和 CLabelUI
差别并不大,主要的区别有两点:
CTextUI
默认多行显示,而CLabelUI
默认单行居中显示- 当绘制 html 内容的时候,若其中有超链接,则需要使用
CTextUI
,其中分装了对超链接的处理
我们来着重看一下 CTextUI
中对 html 中的超链接的处理。先看一个例子。设置控件的text="<a http://www.baidu.com>百度</a>{b}加粗{/b} <c #FF0000>红色</c> {i}斜体{/i}{n} {u}下划线{/u} {n} {s}选中{/s}"
在界面上显示的效果为:
具体支持的格式可以参考方法 DrawHtmlText
中的注释:
// 考虑到在xml编辑器中使用<>符号不方便,可以使用{}符号代替
// 支持标签嵌套(如<l><b>text</b></l>),但是交叉嵌套是应该避免的(如<l><b>text</l></b>)
// The string formatter supports a kind of "mini-html" that consists of various short tags:
//
// Bold: <b>text</b>
// Color: <c #xxxxxx>text</c> where x = RGB in hex
// Font: <f x>text</f> where x = font id
// Italic: <i>text</i>
// Image: <i x y z> where x = image name and y = imagelist num and z(optional) = imagelist id
// Link: <a x>text</a> where x(optional) = link content, normal like app:notepad or http:www.xxx.com
// NewLine <n>
// Paragraph: <p x>text</p> where x = extra pixels indent in p
// Raw Text: <r>text</r>
// Selected: <s>text</s>
// Underline: <u>text</u>
// X Indent: <x i> where i = hor indent in pixels
// Y Indent: <y i> where i = ver indent in pixels
// Vertical align <v x> where x = top or x = center or x = bottom
不过我个人认为这个DrawHtmlText
方法有些鸡肋,功能不完善且不易使用 (仅发表个人观点,不喜勿喷)
- 超链接相关的成员变量
- int m_nLinks 超链接的个数,不会超过 MAX_LINK
- RECT m_rcLinks[MAX_LINK] 超链接的位置,矩形区域的数组
- CDuiString m_sLinks[MAX_LINK] 各个连接的 url
- m_nHoverLink 当前鼠标悬停在第几个超链接上
- DoEvent 中的处理
- 收到
UIEVENT_SETCURSOR
时,若鼠标在某个超链接上则设置鼠标为手型 - 收到
UIEVENT_BUTTONUP
事件时,若鼠标在某个超链接上则发送DUI_MSGTYPE_LINK
通知,在监控通知的地方可以进行打开 url 或者打开某个程序等等 - 收到
UIEVENT_MOUSEMOVE
时计算m_nHoverLink
的值,个人认为这个值应该用于绘制超链接的悬停的颜色控制上,但目前的源码中绘制时并没有使用到这个成员变量。 而且在DrawHtmlText
方法中只是判断是否悬停在了某个超链接上,这样导致所有的超链接颜色都会改变,这应该是一个 bug
- 收到
综上,我认为 CTextUI
主要是默认做成了多行显示,而且这一点 CLabelUI
中也可以通过添加 multiline 属性做到 (有些版本的 Duilib 不支持),而 CTextUI
控件的 html 的绘制目前来看效果不是很好。大家可以根据自己手中版本的 Duilib 在适当的场合选择使用 CTextUI
和 CLabelUI
关键在于属性的控制上。