Duilib 源码分析之 CTextUI 篇

Duilib 中的 CTextUICLabelUI 差别并不大,主要的区别有两点:

  1. CTextUI 默认多行显示,而 CLabelUI 默认单行居中显示
  2. 当绘制 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 在适当的场合选择使用 CTextUICLabelUI 关键在于属性的控制上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值