Skip to content

由官方的duilib( https://github.com/duilib/duilib ) 复制过来的,仅为了个人学习使用。可以使用vs2008打开,新增一些学习测试用的demo,代码也会同步官方的后续修改。Q群:594312689。欢迎交流学习。

License

juhuaguai/duilib

Repository files navigation

duilib

由官方的duilib( https://github.com/duilib/duilib ) 复制过来的,仅为了个人学习使用。
可以使用vs2008打开,新增一些学习测试用的demo,之后也可能会做很少的修改,但代码尽量会与官方保持一致。
有任何问题请联系我,邮箱juhuaguai@yeah.net
腾讯使用的的duilib修改版: https://github.com/TencentCloud/TIMSDK/tree/117305e08ec67c3319883e71d1f3ee5f018016af/Windows/Demo/Basic/duilib
网易使用的duilib修改版: https://github.com/netease-im/NIM_Duilib_Framework/tree/master/duilib


## 说明:
## 官方库改为本仓库代码后,会遇到CDuiString的一些编译或者运行报错,原因在于我调整了CDuiString的代码(见下方第55点说明),解决方法就是重新使用本仓库的duillib的头文件和.lib重新编译和链接生成自己的程序,解决其中的编译报错(主要是CDuiString转换为LPCTSTR时报错,修改CDuiString.GetData())即可。
## 有问题欢迎反馈!

### 2020/12/31更新移除掉了libpng相关库,apng解析绘制直接使用stbimage和自己实现的代码来处理了。同时gif也由gdi+解析改为了stbimage处理。
这样看来是有机会将gif和apng统一成一个控件的,进一步来看考虑,是有机会让所有支持背景图的控件支持gif和apng的,暂无需求先不考虑了。


本仓库改动日志:
1.将解决方案sln切换为vs2008打开
2.添加webbrowser控件对js方法window.close的响应
3.给combo控件增加selectedid属性,以便于在xml中可以直接配置默认选中的item
4.给combo控件增加textcolor/font/align属性,便于自由配置combo控件显示的文字的颜色/字体/水平对齐方式
5.给combo控件的下拉窗口增加Notify过滤,将下拉窗口中的DUI_MSGTYPE_ITEMCLICK,DUI_MSGTYPE_ITEMACTIVATE,DUI_MSGTYPE_LINK ,DUI_MSGTYPE_CLICK异步转发到combo控件所在的窗口的notify中
6.修复listElement listContainerElement标签的selected属性false不生效的bug
7.修复combo下拉框的滚动条不能使用default标签中定义的滚动条样式的问题
8.修复容器的滚动条不能正确取消hot状态的问题
9.修复Combo下拉框滚动条相关标签vscrollbar/hscrollbar/vscrollbarstyle/hscrollbarstyle无效问题;
10.修改所有容器设置vscrollbarstyle属性就默认显示vscrollbar(即便vscrollbar属性值为false)、设置hscrollbarstyle属性就默认显示hscrollbar的处理,使滚动条的显示由vscrollbar/hscrollbar的属性来控制
11.给Button、Edit、combo、option控件增加gdi+的文字绘制,仅仅是为了在半透明窗口中抗锯齿,一些文字阴影渐变发光等特效并没有引入
12.修复Label控件采用gdi+绘制时单行限制失效的问题
13.给button控件增加指定光标样式的属性 cursor ,值类型为字符串。如cursor="arrow"指定hot状态光标样式为箭头样式
14.给richedit补充maxchar属性
15.给CTextUI控件类增加获取links数量和对应文字区域(RECT)的接口,以便于在标题栏使用时,能够更加准确的进行事件响应和拖动过滤
16.修复edit获得输入焦点时,控件高度大于文本高度过多时,会显示异常的bug;
17.修复header="false"不能正常隐藏list表头的bug,原版用header="hidden"也能够隐藏,但是个人认为不够统一,就补充个header="false"
18.对半透明窗口的绘制做了调整,修复半透明窗口中背景色的显示可能不是我们预期效果的bug
19.修复VerLayout中padding的一处bug
20.修复当bordersize的left为0时,其余3边的边框也不绘制的bug
21.修复了某些情况下控件的右边框和下边框绘制不出来的bug;当边框宽度为奇数时保证边框是绘制在控件内部的.
22.对子控件的remove默认改为同步销毁。
23.修正第一焦点是Edit时,窗口创建后edit没有默认处理焦点状态的问题;修复当SetFocusNeeded参数为NULL时,窗口初始仍然会给控件设置焦点的bug
24.修复在DUI_MSGTYPE_WINDOWINIT消息中去同时设置窗口大小和layered时可能不生效的bug
25.对Label动态文本计算所需宽度的结果进行修正,当gdi+绘制文本时宽度能够更加准确
26.修复richedit控件动态创建时某些属性可能不生效(需要先设置属性再add到布局才会生效)的bug,涉及的属性包括滚动条,自动滚动等。
27.richedit的光标颜色调整为跟随文本颜色,避免在与背景色接近导致看不出来光标
28.修复当richedit控件的父容器滚动条滚动后,richedit文本位置不正确的bug
29.给CContainerUI增加了DoPostPaint调用,用来修复EndDown不能及时滚动到最底部(总是差最后一行)的bug
30.修改UIlib.h以便于兼容cef和duilib结合使用
31.修复layeredimage绘制可能不正确的bug;修复开启LayeredImage但是不设置图片时文字穿透的问题。
32.修复duilib在使用list添加表头后异常的bug,例如duipreview在预览包含ListHeader的xml时会无法预览.
33.修复多字节工程编译时一处笔误错误,建议最好还是用unicode版的
34.richedit增加setcaret接口来控制是否显示输入光标
35.给richedit添加个DUI_MSGTYPE_LINK的notify消息
36.给richedit增加FocusImage和disabledImage的绘制
37.给Label和Button控件增加focus背景色和disabled背景色
38.调整透明窗口的绘制,不再采用内容与背景混合的方式,改为先绘制背景,再在背景上绘制内容。除图片和颜色绘制外,文本,线条,矩形,圆角矩形等的黑色全部修正为0xFF000001(原本应该是0xFF000000).
39.修复绘制ARGB背景颜色时,透明度无法正确被绘制的bug(比如0x1EFFFFFF)
40.修复文本颜色值为RGB(而非ARGB)时文本完全透明的bug
41.给字体增加删除线属性支持,Font标签中的strikeout="true"表示该字体带删除线
42.button增加DUI_MSGTYPE_MOUSEENTER和DUI_MSGTYPE_MOUSELEAVE的notify发送
43.修复richedit没有textchanged消息的问题
44.给richedit增加一个SetPasswordChar的导出,用以设置密码密文字符
45.combo控件下拉框样式进行调整。使用Item的背景色,并且移除下拉框的边框
46.移除combo中selectedItem中对于下拉框子项visible的判断
47.修改webbrowser代码,给webbrowser增加JS调用c++的处理。增加了JS与C++互相调用的注释,并在CustomControlDemo中增加了相关示例
48.将duilib的zip解压更换掉.支持了zip加密。
49.增加一个计算文本区域大小的函数SIZE CRenderEngine::EstimateTextSize
50.修复treenode删除子控件时没有完全删除的一个bug
51.修复gif控件一处可能潜在的句柄泄漏
52.完善TileLayout,增加固定行的属性,当设置固定行之后,子控件将自动向右摆放,顺序是自上而下,自左而右,超出可以使用水平滚动条。
53.修复鼠标在gif控件上滑动鼠标滚轮滚动条不会滚动的bug
54.给Control增加ForeImage属性。结合Png图片可以方便的做出圆形头像等效果
55.移除了CDuiString对于operator LPCTSTR() const;的重载,用来支持对操作符==的更多的重载,修改了部分源码和部分demo的源码以便于正常编译
56.补充设置滚动条位置时是否传递事件的参数。手动调用接口改变滚动条位置时,可以设置参数来决定是否传递事件通知
57.CProgressUI控件,文本初始化设置为垂直居中并且单行
58.升级了duilib的图片解码库stb_image由原来的2.05升级到2.19
59.引入官方库其他人提交的PR,用于修复Edit输入状态下的右键菜单
60.简单的给richedit增加个系统的复制粘贴右键弹出菜单
61.修复richedit里面的两处笔误;给richedit中CTxtWinHost类的成员变量名增加m_前缀
62.引入官方库的关于List排序的修复
63.引入官方库的关于List排序后选中错误的修复,同步关于SelectItem参数传递错误的修复,见duilib/duilib#182
64.引入官方库的修复UIRender某些情况下占用文件不释放的bug,见duilib/duilib#186
65.滚动条滚动后位置优化。
66.同步官方库的一个pr,关于CDuiStringPtrMap Remove函数问题修复
67.修复win10系统上,存在Showmodal子窗口时,主窗口仍然能够响应鼠标滚轮消息的问题
68.修复画边框border时,指定为虚线风格不生效的bug.(虚线风格要求border的宽度只能为1)
69.修改showhtml绘制时,标签还需要配合multiline="true"才能生效的问题
70.修改容器的setpos代码,当大小可能变化时,重置容器的滚动条滚动范围。用来修复自动布局时,自动大小的子控件,大小计算不对的问题。(比如简单的自动居中布局,点击显示桌面让窗口最小化,再点击窗口显示时,可能会出现滚动条)
71.修复滚动条不在起始点时,调整List的大小,item与header位置不对应的bug
72.修复Option按钮为选中且禁用状态时,不显示禁用状态的背景图,显示的是选中状态的背景图的问题
73.新增了一个菊花样子的loading控件,gid+绘制。来自于网友提供的loading菊花源码中提取修改
74.新增了一个图片旋转控件,gid+绘制,可以自由控制图片的动态旋转。来自于网友提供的圆环旋转源码中提取修改
75.新增了一个支持gif的按钮控件,参考了官方的gif控件
76.支持设置combo的下拉框的边框大小和颜色
77.调整Button按钮的hotbkcolor和hotforeimage的绘制,让他们能够正常叠加
78.给button按钮增加hotbordercolor属性,能够设置鼠标悬停时按钮的边框颜色
79.调整button按钮的hot背景色与背景图的叠加,当处于鼠标悬停状态并且设置的有Hotbkcolor时,先绘制Hotbkcolor,再在上层绘制背景图
80.调整option控件的选中背景色与背景图的叠加,当处于选中状态时,先绘制SelectedBkColor,再在上层绘制背景图
81.给richedit增加tipvalue,通过tipvalue和tipcolor可分别设置提示文本的内容和颜色。主要参考redrain的duilib库中的实现
82.给richedit增加开启关闭密码属性的接口
83.caption属性的bottom增加值为-1的支持,为-1时表示caption区域一直到窗口底部
84.给窗口类引入IsHTCaptionFlag函数,用于判断指定控件是否不被Caption区域过滤,如果为true,则说明指定控件的区域可以作为caption区域
85.修复textui控件中非showhtml时a标签数量计数错误的问题。
86.修复richedit在win7系统上内容可能被缩小的bug。(richedit作为子控件放到容器中,如果容器中包含有滚动条,滚动容器的滚动条,richedit的内容可能会随之缩放)
87.修复某些情况下showmodal不能返回正确的关闭值的问题。(比如在子窗口标题栏被鼠标左键按下不松开时调用了Close来关闭窗口)
88.新增了一个动画控件用来支持apng,使用了libpng来解析生成每帧数据,GDI+去绘制,同时支持设置背景色和文本
89.新增了一个支持apng动画的按钮控件,使用了libpng来解析生成每帧数据,GDI+去绘制,同时支持设置背景色和文本,支持背景图dest设置。
90.修复图片旋转控件旋转时图像像素漂移的问题。
91.PaintManager新增了字体相关静态接口,可以使用ttf文件或者ttf内存流来引入新字体,比如PingFang字体,思源字体等win没有自带的字体。在窗体创建之前调用。AddTTF之后,可以像使用系统字体(比如宋体、微软雅黑)那样在xml或者程序中使用。注意字体版权问题。
92.gif和apng解析都使用stbimage解析,同时绘制采用gdi,gif抛弃了gdi+,apng抛弃了libpng库。这样gif控件和apng控件的背景图就类似普通控件背景图,支持file,source,dest,xtiled,ytiled,mask等属性了。
93.修复图片仅设置xtiled=true不设置ytiled时,平铺效果不对的问题。
94.新增combo的下拉框的背景色的属性dropbkcolor,可以设置下拉框背景色而不再使用itembkcolor作为下拉框背景色了。itembkcolor仅仅是下拉款里面item的背景色。
95.button控件增加hotbordercolor属性的解析和使用,之前支持hotbordercolor,但是xml解析时并没有解析该属性,该属性表示鼠标悬停状态时控件边框的颜色。
96.给Combo控件增加mousewheel属性,用来控制Combo是否支持滚轮切换选项的操作,默认为true。当mousewheel为false时,鼠标移动到Combo控件上,滚动滚轮不会引起combo选项的改变。在一些combo放到有滚动条的布局的情况下,可能比较有用(可以有效防止鼠标滚轮的误操作)。
97.给Label控件增加autocalwidth,autocalheight属性,默认为false。用来表示改控件是否根据文本内容自动计算宽高。请仅在float=false下使用。如果同时存在指定了width或height,那么width的优先级高于autocalwidth,height的优先级高于autocalheight。常用于单行文本时根据文本内容自动计算调整宽度,多行文本给定宽度时自动计算并调整高度。(使用过程中有问题可以提issue给我)。
98.在CRenderEngine中增加两个转换svg格式的方法:
SvgFile2PngFile将svg文件转换成指定大小的png图片存到磁盘;
SvgFile2HBITMAP将svg文件转换成duilib的HBITMAP,可以不存磁盘直接addimage来调用。

其他改动:
1.修改了几处官方库中的笔误。
2.会同步官方库的修复,并且一些提交到官方库的pr如果我认为没问题也会抄过来,一些issue如果我能够优化的,也会尝试优化并提交,Q群里有反馈的bug或者改进我也会抄过来
3.增加个编译静态的配置。自己的工程引入了静态库报一些无法解析之类的,尤其是dllimport之类的,这说明需要将UILIB_STATIC也加入到自己的工程中。因为dllimport之类的显然是动态库用的东西。
4.引入了DuilibPreview工具和源码,可以方便的在editplus和notepad++中预览xml文件,可以一边修改xml一边预览啦,具体参看DuilibPreview工程目录下的说明
5.combo的itemfont建议都是用 shared="true"的字体,因为非共享资源的字体并没有加载到下拉框的PM中。其实最好所有的字体都用shared="true",这样可以避免多个窗口重复的添加同样的字体,也方便管理。
6.增加了一个gifbutton控件,放到了CustomControlDemo中
7.收集了一些来自网络的duilib相关的代码,分享出来供大家参考使用
8.提交个扩展容器,支出鼠标移入移出。移入移出时容器背景图和背景色可以自动切换,同时可以指定子控件是否跟随移入移出来显示隐藏。
9.备注下,滚动条可以指定每次滚动的幅度,例如:hscrollbarstyle="height="0" scrollunit="726"" 指定了滚动条宽度为0,每次滚轮滚动幅度为726像素
10.给两个demo引入系统自带的CS_DROPSHADOW的边框阴影测试,需要系统开启默认阴影效果,代码:SystemParametersInfo(SPI_SETDROPSHADOW,0, (PVOID)TRUE, 0);
11.增加了窗口阴影属性,不使用额外窗口,而是在当前窗口边框直接绘制。bin/Res目录下有shadowdemo.xml可以看。
详细说明:
1).需要layeredimage属性支持,即需要启用分层窗口(异形窗口)。
2).通过shadowsize来控制阴影的宽度,暂时没有做四边阴影分开设置的处理,四边的阴影宽度都是相同的。
3).阴影部分在caption区域也不会响应拖动,如有需要可自行修改源码。
4).窗口的尺寸是包含了阴影区域的。
5).通过shadowcolor来设置阴影渐变终止色。即阴影是从0x00000000渐变到shadowcolor的值,具体代码可以查看paintshadow函数。
6).通过shadowfocusscales来设置窗口阴影渐变效果缩放。0-1之间,值越大,阴影颜色越深。当为默认值-1时,将自动计算合适的值(计算方法:(100-shadowsize)/100,结果小于0时取0,大于1时取1)。
7).因为有些窗口原先不是分层窗口,上面的文字,border等都是gdi绘制,其像素没有alpha通道,启用分层窗口后会变透明,鼠标也会穿透。为了便于使用阴影窗口,引入了nolayeredpadding属性。
8)通过nolayeredpadding来设置非分层区域的外边距。意思是,窗口大小减去外边距之后的矩形区域,其像素将被强制修复alpha为255。这样就避免透明和鼠标穿透了。

About

由官方的duilib( https://github.com/duilib/duilib ) 复制过来的,仅为了个人学习使用。可以使用vs2008打开,新增一些学习测试用的demo,代码也会同步官方的后续修改。Q群:594312689。欢迎交流学习。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published