Duilib是以自绘图为主要表现手段的界面库,故实现换肤非常简单,可以通过给控件设置不同的自绘配置来实现换肤,比如给需要换肤的控件调用CControlUI::SetBkImage。但是针对换肤功能,Duilib提供了更为简单的方法,即使用CPaintManagerUI::ReloadSkin。
假设我们给程序创建了两套皮肤,分别打包成skin1.zip和skin2.zip,在程序运行的时候,执行:
CPaintManagerUI::SetResourceZip(_T("skin1.zip")); // 或者skin2.zip
CPaintManagerUI::ReloadSkin();
这样简单的两行代码,就实现了全部窗口从skin2皮肤到skin1皮肤的切换。你也可以随时再次调用上面两行代码,把皮肤切换回去。
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 APIENTRYWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/,int nCmdShow)
{
CManager::SetInstance(hInstance);
CManager::SetResourcePath(CManager::GetInstancePath());
CManager::LoadPlugin(PLUGINNAME);
// ……
}
Duilib使用资源打包功能非常简单,在程序开发完成后只需做两个步骤即可:
进入资源目录,然后使用具备zip压缩功能的软件(如winrar、winzip、7zip等)把布局xml和图片等资源压缩到一个zip文件包里。
在WinMain函数中CPaintManagerUI::SetInstance(hInstance)的后面加入CPaintManagerUI::SetResourceZip(_T("xxx.zip")),如
int APIENTRYWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/,int nCmdShow)
{
CManager::SetInstance(hInstance);
CManager::SetResourcePath(CManager::GetInstancePath());
CPaintManagerUI::SetResourceZip(_T("xxx.zip"));
// ……
}
这样就完成了资源打包功能,发布程序只需要把exe、dll和zip文件带上就行了。有时为了需要,也可以修改.zip为其他扩展名,比如.dat。