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

Duilib 源码分析之 CTextUI 篇

2017-12-20 18:06 701 查看
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
关键在于属性的控制上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  html 源码 控件