最近在做一个小玩具,C++上面实在是没什么好用的或者轻量级的开源DUI库了,duilib算是比较出名的一个,不过这玩意好几年没人维护,之前据说pc微信也用过这个开发,所以有意试试。用了一段时间感觉,这玩意的代码结构确实够旧的,而且使用中也存在不合理的地方,比如所有的窗口都需要一个CPaintManagerUI来管理,这就很奇怪,用过Qt,用过游戏引擎里的UI库,也用过腾讯内部的GF和项目组里自己的引擎,哪个都比这玩意封装得好用,代码风格也漂亮,可惜没法拿出来用,每每想到这里就十分忧伤,我以后怕是不会再单独拿C++来做界面了,太累。
牢骚完了,说一说遇到的小BUG,由于功能需求我得用半透明窗口,首先这玩意你需要调用CPaintManagerUI的SetLayered(true),这个没看到什么人提到,不过官方demo里是有的,不然你自己用windows api整半天都搞不对的。完成窗口半透明后,我绘制了一个全透明窗口,几个图片和空间,你会发现Text和Label里的文字显示不出来了,但是控件和图片的绘制完全OK。我一路找到CRenderEngine::DrawText,发现duilib没有对Layered下的文字alpha做处理,之前维护项目组内部界面库的时候有过研究,在Layered模式下
::SetBkMode(hDC, TRANSPARENT);
::SetTextColor(hDC, RGB(GetBValue(dwTextColor), GetGValue(dwTextColor),
GetRValue(dwTextColor)));
HFONT