国内首个开源 的directui 界面库,开放,共享,惠众,共赢,遵循bsd协议,可以免费用于商业项目,目前支持Windows 32 、Window CE、Mobile等平台。
Duilib 是一款强大的界面开发工具,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率。提供所见即所得的开发工具UIDesigner。使用DirectUI后将使得我们的设计人员彻底解 放,不会受到开发的束缚,可以充分地发挥其设计能力来设计软件界面,并参与到用户界面开发过程中。 Duilib 目前支持Windows 32 、Window CE、Mobile等平台,使用C++开发,遵循BSD协议,可以免费用于商业项目 。
DirectUI界面库 取名自微软的一个窗口类名“DirectUIHWND”,意为Paint on parent dc directly。 即子窗口不以窗口句柄的形式创建,只是逻辑上的窗口,绘制在父窗口之上。
Duilib界面库的出现解决了使用传统MFC界面库开发软件不美观、界面细节处理不好、使用硬编码、开发效率低下、生成程序体积大等问题。而且传统MFC界面美化库大都使用HOOK等对系统影响比较大的技术,可能会导致系统不稳定或者引发其他错误。而Duilib界面库完全基于GDI在窗口上自绘,无其他依赖,未使用特殊或危险的系统调用,能够很好的解决传统MFC界面的一系列问题。
Duilib界面库完全兼容ActiveX控件(如常见的IE控件和Flash),也可以和MFC等界面库配合使用,用户完全可以不用担心切换到Duilib界面库上面会带来额外的成本或者Duilib界面库会出现功能不够用等情况。
Duilib界面库可广泛用于互联网客户端、工具软件客户端、管理系统客户端、多媒体客户端(如KTV、触摸屏)、车载电脑系统、gps系统和手机客户端软件等。
如何完成自己的duilib开发呢,首先需要的是duilib的相关文件,包含了dll、lib、头文件等。可以到“duilib开发所有文件”中去下载。
接下来的工作就是新建一个自己的 win32项目,取名为HelloDUILIBWorld,注意不要建立win32控制台应用程序,两者的区别可以参阅博客《Hey,别搞错了Win32项目和Win32控制台程序》。
新建一个工程后,添加一个空的.cpp文件,并进行编译。(此时编译会出现错误,但是没关系,我们编译的目的是为了生成Debug文件夹)
接下来就要用到我们所下载的duilib的文件了,首先是复制四个dll到Debug文件夹,注意,是图中的Debug文件夹:
然后将除了dll之外的所有文件复制到HelloDUILIBWorld的HelloDUILIBWorld文件夹下:
现在所有的配置完成了,就要开启我们的HelloWorld之旅了!
首先是导入lib、头文件、命名空间等,需要注意的是UIlib.h不是系统文件,需要使用”“而不能使用<>。
// TODO: 在此处引用程序需要的其他头文件
#include "UIlib.h"
using namespace DuiLib;
#ifdef _DEBUG
# ifdef _UNICODE
# pragma comment(lib, "DuiLib_ud.lib")
# else
# pragma comment(lib, "DuiLib_d.lib")
# endif
#else
# ifdef _UNICODE
# pragma comment(lib, "DuiLib_u.lib")
# else
# pragma comment(lib, "DuiLib.lib")
# endif
#endif
下面就要实现自己的类了,需要继承duilib中的CWindowWnd和INotifyUI两个类。通过查看duilib的源码,我们可以看到在CWindowWnd和INotifyUI两个类中一共有三个纯虚函数,这里需要进行重写。
简单介绍一下这三个函数:
LPCTSTR GetWindowClassName() const {}
这是个纯虚函数,大家看UIBase.cpp里对它的引用就可以明白为什么非要实现它,因为
在注册窗口类时所用的类名(classname),就是用GetWindowClassName()来获取的
与此类似地,大家可以通过重写UINT GetClassStyle() const {}来为注册窗口类时,指定//类别
在360Demo中重写了这个函数,大家可以去看看
void Notify(TNotifyUI& msg){}
在新类中可以通过实现该类,来实现消息拦截,从而当指定的消息出现时,响应我们的函数
这个函数主要用来处理窗口上的控件发出来消息的响应
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){}
消息处理函数,这个主要用来处理对话框窗口产生的消息
———————————————————————————————————*/
class CDuiFrameWnd : public CWindowWnd, public INotifyUI
{
public:
virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }
virtual void Notify(TNotifyUI& msg) {}
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRes = 0;
if( uMsg == WM_CREATE )
{
CControlUI *pWnd = new CButtonUI;
pWnd->SetText(_T("Hello World")); // 设置文字
pWnd->SetBkColor(0xFF00FFFF); // 设置背景色
m_PaintManager.Init(m_hWnd);
m_PaintManager.AttachDialog(pWnd);
return lRes;
}
if( m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) )
{
return lRes;
}
return __super::HandleMessage(uMsg, wParam, lParam);
}
protected:
CPaintManagerUI m_PaintManager;
};
下面就是开写程序的入口函数了,即winmain函数。
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
CPaintManagerUI::SetInstance(hInstance);
CDuiFrameWnd duiFrame;
duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
duiFrame.ShowModal();
return 0;
}