一个轻量级C++DirectUI库的开发
发表于|更新于|C++
C++ DirectUI库并不是一项新技术了,网上也有很多现成的库比如大名鼎鼎的Duilib还有其他一些,然而最讨厌的一点是没有开发文档……干啥都要翻代码(别人的代码……),在参考了其他一些dui库之后,我打算自己开发一套DirectUI库,也当是练练手了。
UI库特性
- 轻量级,争取控制在5M以内,CEF组件根据需要由用户添加
- 模块化,可以方便的添加修改组件/渲染方式/资源类型等
TODO……
文章作者: imwxz
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Matrix!
相关推荐

2017-11-02
开源库rapidxml和zlib的冲突
DuiMini准备用rapidxml解析xml界面配置,zlib解压文件,本来两个都是非常好的库,然而…… WTF编译报错:XXX语法错误:“” 还有一堆乱七八糟的东西……什么鬼啊,一开始我以为是我使用的问题,然而和网上教程对比了一下没有什么问题啊,试了半天发现这个错误极其诡异,有时候报有时候不报,然而我要用的地方它就报了……看错误信息貌似是和zlib存在冲突(调整头文件引用顺序也可看出),百毒搜搜没什么东西,心态崩了…… 问题出现回去后用“不存在”搜索引擎一查,果然百毒还是百毒,歪果仁早就遇到过了这就是一个冲突的BUG,两个都有一个叫alloc_func的函数,rapidxml还好有命名空间保护,然而zlib不上路子直接暴露在外面……于是神奇的编译器就会在模板实例化时把zlib的func当成rapidxml的了…… 解决方法网上的方法非常暴力简单,搜索zlib或rapidxml中的alloc_func,改成alloc_func1或者其他的就行了……有兴趣的朋友可以试试给zlib加命名空间。 最后还是要说,真TM坑……

2017-11-02
DuiMini的模块化设计
基本需求是可以方便地删改不同的组件,比如添加一种资源加载的方法或者新的渲染方式。一般有三到四层包装:首先是一个IUIXX接口类,给出所有组件的对外接口,然后是继承自接口类的组件(涉及第三方库的可能在Util中初步封装),最后是一个Manager,通过多态实现组件的调用。当然,每个组件也可作为Manager再次分级。

2017-11-02
DuiMini中的异常处理
我们不使用 C++ 异常. ——Google 开源项目风格指南 出于以下原因,DuiMini将禁用C++异常: 效率和库体积控制 便于和其他禁用异常的项目兼容 本人不喜欢C++的异常处理 因此我设计了一个UIException用于处理异常并在必要时终止程序,而所有的异常处理都放置在Manager层中(关于模块化设计),接口统一返回错误码进行判断。因此: 调用最低级的Manager层总是安全的(除非特殊说明,一般处于该层的异常均为致命异常,会直接终止程序) 调用由Manager组成的更高一级的Manager层一般也是安全的,因此无需处处考虑返回异常(许多函数都保证执行成功)

2018-02-05
DuiMini的消息响应机制
为了简单起见,我封装了一个UIEvent类,用户可以通过相关函数解析WPARAM/LPARAM或者自行处理,不在事件枚举中的不常见事件也可以通过重载MsgHandler截获到。 至于Notify机制,原先我想的是在UIWindow中记录控件名-消息-函数的映射,然后在消息响应时查表即可。但是后来考虑了一下为了可拓展性强,势必要允许类似WM_MOUSEMOVE这类频繁调用的函数被响应,这样会造成严重的性能下降,而且反复查找的效率也不高。因此我就用空间换时间,在每个控件中开一个MsgHandleFun msgmap_[kWM_End_]函数指针数组,设置的时候查找一次,然后控件记录对应消息的函数指针,这样在窗口收到消息之后,通过原先的消息机制发送给控件,控件直接根据消息的值调用数组中的函数执行响应就行了,避免了每次查找浪费时间。 类似MFC的事件绑定,我也弄了一套宏,注意这里涉及了成员函数指针,和普通函数指针完全不同,参看这里 12345#define MSG_MAP_BEGIN(theclass) virtual void _CtrlBindMsgHand...

2018-03-10
DuiMini最大化最小化处理
原本以为这并不会造成困难,然而由于全部采用了自绘,一些系统默认处理的东西会出现问题,下面是我遇到的麻烦和解决办法。

2019-03-07
跨平台资源文件嵌入可执行文件的实现
一般而言我们都会将一些资源文件(图片、声音啥的)放在程序同级目录下,以此组成我们的应用程序。但是有些时候,我们想将资源文件嵌入到可执行文件中从而实现单文件,为此我结合了一些国外论坛上的方法实验了几下。 Windows下的实现Windows下实现其实还是很简单的,微软爸爸已经准备好了API,FindResource,LoadResource等实现相当简单,在VS中几乎是“一键式”的,在此不做过多讨论。 Linux下的实现Linux下就比较麻烦了,没有VS,也没有RC资源之类的概念,因此不太好搞。国外有网友通过研究ELF文件结构然后用汇编加进去,这种方法虽然可以但是比较麻烦(https://stackoverflow.com/a/36295692)。 OSX下的实现没有玩过水果系统,有知道的可以评论留言。 跨平台实现暴力编译这种方法比较暴力,具体来说就是使用xxd等工具把文件转成一个头文件,里面其实就是一个静态字符数组,然后内容就是文件的二进制数据。使用的时候直接调用这个数组就行了,相当于加载到内存……然而这种方法缺点很明显,稍大一点的文件生成的.h头文件大小非常恐怖,一个小几十M的...
评论

imwxz
Sometimes it is the people no one can imagine anything of who do the things no one can imagine.
RSS