原来在写MFC的时候感觉界面太丑太单调了,想自己弄一个好看一点的APP,大多皮肤要么收费要么不好用。后来看到Duilib皮肤库,果然很强大。下面看下简介 国内首个开源 的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。 即子窗口不以窗口句柄的形式创建,只是逻辑上的窗口,绘制在父窗口之上。 DirectUI界面库使用XML来描述界面风格,界面布局,可 以很方便的构建高效,绚丽的,非常易于扩展的界面。从而很好的将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。
认识了这玩意儿现在开始动手吧,首先创建一个Win32工程,名字任意,注意:Windows应用程序。然后把相关的头文件复制到工程的Duilib目录(便于区分),如图:
然后在stdafx.h头文件末尾加上以下代码:
认识了这玩意儿现在开始动手吧,首先创建一个Win32工程,名字任意,注意:Windows应用程序。然后把相关的头文件复制到工程的Duilib目录(便于区分),如图:
然后在stdafx.h头文件末尾加上以下代码:
// TODO: 在此处引用程序需要的其他头文件 #include我用的是Unicode工程,库也是UNICODE格式编译的。如果你是多字符集就需要重新编译Duilib工程。然后在CPP中实现DUILIB的界面类//一定要加此头文件,uirichedit.h 报错:error C2143: 语法错误 : 缺少“;”(在“*”的前面) #include "Duilib\UIlib.h" using namespace DuiLib; #ifdef _DEBUG #pragma comment(lib, "DuiLib_d.lib")//debug #else #pragma comment(lib, "DuiLib.lib")//release #endif
// DUIDemo.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "DUIDemo.h" class CFrameWindowWnd : public CWindowWnd, public INotifyUI { public: CFrameWindowWnd() { } ~CFrameWindowWnd() { } LPCTSTR GetWindowClassName() const { return _T("UIMainFrame"); } UINT GetClassStyle() const { return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; } void OnFinalMessage(HWND /*hWnd*/) { delete this; } void Init() { } void Notify(TNotifyUI& msg) { } LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { if( uMsg == WM_CREATE ) { m_pm.Init(m_hWnd); CDialogBuilder builder; CControlUI* pRoot = builder.Create(_T("DuiLib.xml"), (UINT)0, NULL, &m_pm); ASSERT(pRoot && "Failed to parse XML"); m_pm.AttachDialog(pRoot); m_pm.AddNotifier(this); Init(); return 0; } else if( uMsg == WM_DESTROY ) { ::PostQuitMessage(0L); } else if( uMsg == WM_ERASEBKGND ) { return 1; } LRESULT lRes = 0; if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes; return CWindowWnd::HandleMessage(uMsg, wParam, lParam); } public: CPaintManagerUI m_pm; }; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); HRESULT Hr = ::CoInitialize(NULL); if( FAILED(Hr) ) return 0; CFrameWindowWnd* pFrame = new CFrameWindowWnd(); if( pFrame == NULL ) return 0; pFrame->Create(NULL, _T("DuiLib"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); pFrame->CenterWindow(); pFrame->ShowWindow(true); CPaintManagerUI::MessageLoop(); ::CoUninitialize(); return 0; }
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2305
- 用户1336
- 访客11455538
每日一句
Talent without working hard is nothing.
没有努力,天份不代表什么。
没有努力,天份不代表什么。
MySQL 数据库优化
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
免ROOT实现模拟点击任意位置
Mobaxterm终端神器
CreateProcessW要注意的细节问题
Autonomous NAT Traversal
【教程】win10 彻底卸载edge浏览器
eclipse工程基于Xposed的一个简单Hook
排名前5的开源在线机器学习
Mac OS最简单及(Karabiner)快捷键设置
发一款C++编写的麻将
VMware NAT端口映射外网访问虚拟机linux
独家发布最新可用My-AutoPost——wordpress 采集器
新会员