12DUILib经典教程(实例)(3)
Duilib是一个以贴图为主要表现手段的界面库,实现换肤非常简单,可以通过给控件设置不同的图片来实现换肤,比如给需要换肤的控件调用CControlUI::SetBkImage。但是针对换肤功能,Duilib提供了更为简单的方法,即使用CPaintManagerUI::ReloadSkin。 假设我们给程序创建了两套皮肤,分别打包成skin1.zip和skin2.zip,在程序运行的时候,执行: CPaintManagerUI::SetResourceZip(_T("skin2.zip")); // 或者skin1.zip CPaintManagerUI::ReloadSkin(); 这样简单的两行代码,就实现了全部窗口从skin1皮肤到skin2皮肤的切换。你也可以随时再次调用上面两行代码,把皮肤切换回去。 7 Dll插件 ? Duilib支持使用外部dll来扩展控件: 在dll中,只需要实现一个接口CreateControl,如 extern "C" __declspec(dllexport) CControlUI* CreateControl(LPCTSTR pstrType) { if( _tcscmp(pstrType,_T("ButtonEx")) == 0 ) return new CButtonExUI; return NULL; } ? 在使用程序中,需要在WinMain函数把插件dll使用CPaintManagerUI::LoadPlugin 加载进来,然后就可以和内置控件一样使用了。 int APIENTRY WinMain(HINSTANCE hInstance,int nCmdShow) { CManager::SetInstance(hInstance); CManager::SetResourcePath(CManager::GetInstancePath()); CManager::LoadPlugin(PLUGINNAME); // …… } 8 资源打包 Duilib使用资源打包功能非常简单,在程序开发完成后只需做两个步骤即可: ? 进入资源目录,然后使用具备zip压缩功能的软件(如winrar、winzip、7zip等)把 布局xml和图片等资源压缩到一个zip文件包里。 ? ?在WinMain函数中CPaintManage;CPaintManagerUI::SetReso;intAPIENTRYWinMain(HINST;CManager::SetInstance(hI;CManager::SetResourcePat;CPaintManagerUI::SetReso;//……;这样就完成了资源打包功能,发布程序只需要把exe; ? 在WinMain函数中CPaintManagerUI::SetInstance(hInstance)的后面加入 CPaintManagerUI::SetResourceZip(_T("xxx.zip")),如 int APIENTRY WinMain(HINSTANCE hInstance,int nCmdShow) { CManager::SetInstance(hInstance); CManager::SetResourcePath(CManager::GetInstancePath()); CPaintManagerUI::SetResourceZip(_T("xxx.zip")); // …… } 这样就完成了资源打包功能,发布程序只需要把exe、dll和zip文件带上就行了。有时为了需要,也可以修改.zip为其他扩展名,比如.dat。 9 Duilib在MFC或WTL程序中的应用 MFC和WTL依托强大的Windows Common Controls实现和十多年的发展,在传统软件界面领域占了统治地位,很多的现有软件代码都是使用MFC(或WTL,下同,不再特别注明)写的。所以对于一个界面库来说,兼容MFC和WTL显的非常重要。 如果一个软件希望从MFC界面转换到Duilib,或者打算使用Duilib做界面,但是又希望使用MFC的其他功能,这时Duilib和MFC混合使用就派上用场了。 在MFC中使用Duilib,可以按以下步骤操作: ? 在BOOL CXXXApp::InitInstance()函数中,添加 杭州月牙儿网络 DuiLib::CManager::SetInstance(CWinAppEx::m_hInstance); DuiLib::CManager::SetResourcePath(DuiLib::CManager::GetInstancePath()); 注意需要添加在MFC窗口创建之前。 ? 创建Duilib窗口类 class CDuiWnd : public DuiLib::CWindowWnd,public DuiLib::INotifyUI { public: CDuiWnd(); LPCTSTR GetWindowClassName() const; UINT GetClassStyle() const; void Notify(DuiLib::TNotifyUI& msg); LRESULT HandleMessage(UINT uMsg,LPARAM lParam); public: DuiLib::CPaintManager m_manager; }; ? 在MFC窗口类中创建Duilib窗口 m_duiWnd.Create(*this,UI_WNDSTYLE_CHILD,642,520); m_duiWnd.Init(); m_duiWnd是MFC窗口类的成员变量。 杭州月牙儿网络 示例:绿色框内是Duilib窗口,外层是MFC对话框。 杭州月牙儿网络 (编辑:ASP站长网) |