前言
目前将要接手的一个活儿是将duilib写的项目转为Qt,为此,我稍微了解了一下duilib这个框架,并且写了一个简单的hello world。
先稍微了解一下duilib吧:(来自网络)
Duilib 是 国内首个开源 的directui 界面库,是一款强大的界面开发工具,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率。 Duilib 目前支持Windows 32 、Window CE、Mobile等平台,使用C++开发,遵循BSD协议,可以免费用于商业项目 。
DirectUI界面库使用XML来描述界面风格,界面布局,可 以很方便的构建高效,绚丽的,非常易于扩展的界面。从而很好的将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。
我来总结一下吧,Duilib是一款轻量的界面库,一般用于开发Windows应用,xml书写界面,c++描述逻辑,易于开发。但是Duilib没有专业的团队维护管理,也没有官方文档,所以比较小众。
准备工作
下载库:https://github.com/duilib/duilib
下载界面开发工具(不好用,但是聊胜于无):https://github.com/quanzhuo/DuiDesigner
代码和说明
开发工具:vs2017
创建项目及使用DuiDesigner具体流程参考:Duilib教程-HelloDuilib及DuiDesigner的简单使用 - 夜雨無聲 - 博客园 (cnblogs.com)
我在这里只说一下我遇到的问题:
xml及图片路径:
一般是在可执行文件路径下创建一个叫skin的文件夹,然后把xml和资源图片放进去(图片可另外创建子文件夹保存)。如下图
然后代码中一定要设置资源的路径,不然是找不到xml文件,运行不了的。
//将此段代码写到mian函数创建窗体之前,进行资源路径的设置
CPaintManagerUI::SetResourceType(UILIB_FILE);
CDuiString sResPath;
sResPath.Format(_T("%sskin"), CPaintManagerUI::GetInstancePath());
CPaintManagerUI::SetResourcePath(sResPath);
在设置此路径后,就可以在获取皮肤文件上直接写了
virtual CDuiString GetSkinFile() { return _T("UISkin1.xml"); }
添加标题栏
默认的窗体是没有标题栏的,这就很奇怪,也不知道是不是我姿势不对,反正是我新加了自定义的标题栏
xml文件时这么写的:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window size="800,600" caption="0,0,0,32">
<Font id = "1" name="楷体" size="30" italic="false" />
<VerticalLayout width="800" height="600" bkimage="img10.jpg">
<HorizontalLayout height="32" bkcolor="#FFE6E6DC" bkcolor2="#FF00AAA0">
<VerticalLayout height="32" />
<VerticalLayout width="77" height="32">
<Button name="minbtn" tooltip="最小化" float="true" pos="0,5,0,0" width="23" height="19" bkimage="209.bmp" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="file='MinNormal.bmp'" hotimage="file='209.bmp'" />
<Button name="closebtn" tooltip="关闭" float="true" pos="44,5,0,0" width="28" height="19" bkimage="206.bmp" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="file='CloseNormal.bmp'" hotimage="file='206.bmp'" />
</VerticalLayout>
</HorizontalLayout>
<HorizontalLayout>
<Button font="1" name="btn1" text="Hello World" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" />
</HorizontalLayout>
</VerticalLayout>
</Window>
注意:在Window下设置caption,这样自定义的标题才能拖动窗体。
c++代码中重写方法OnClick,这样才能响应关闭和最小化(我只配置了这两个按钮,因为我只有这两个图片~,但是下面代码写了响应)
void CHelloDuilibWnd::OnClick(TNotifyUI& msg)
{
CDuiString sCtrlName = msg.pSender->GetName();
if (sCtrlName == _T("closebtn"))
{
PostQuitMessage(0);
return;
}
else if (sCtrlName == _T("minbtn"))
{
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
return;
}
else if (sCtrlName == _T("maxbtn"))
{
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);
return;
}
else if (sCtrlName == _T("restorebtn"))
{
SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0);
return;
}
}
结束语
大概就如此。