关于Duilib的换肤问题:
首先需要在xml文件中定义一个控件(一般是布局),下面代码的取名叫bg
接下来在c++的事件代码中,对应的事件处理函数中加入如下代码就能实现换肤功能了:
if (_tcsicmp(msg.pSender->GetName(), "bg") == 0)
{
CControlUI* background = m_PaintManager.FindControl("bg");
if (background != NULL)
{
TCHAR szBuf[MAX_PATH] = {0};
++bk_image_index_;
if (kBackgroundSkinImageCount < bk_image_index_)
bk_image_index_ = 0;
_stprintf_s(szBuf, MAX_PATH - 1, _T("file='bg%d.png' corner='600,200,1,1'"), bk_image_index_);
//设置背景图片
background->SetBkImage(szBuf);
//换肤一般是需要用观察者模式,因为在一个系统的软件中
//换肤的不仅仅是一个界面,而是一系列的界面,所以点击了
//换肤按钮时,不仅需要换当前的页面,还需要换其他的页面
//所以使用观察者模式通知其他所有的观察者进行页面的更新
//观察者模式需要传递的参数
// SkinChangedParam param;
// CControlUI* background = m_PaintManager.FindControl(kBackgroundControlName);
// if (background != NULL)
// {
// param.bkcolor = background->GetBkColor();
// if (_tcslen(background->GetBkImage()) > 0)
// {
// _stprintf_s(szBuf, MAX_PATH - 1, _T("bg%d.png"), bk_image_index_);
// }
//
// param.bgimage = szBuf;
// }
//观察者模式,具体代码省略,就是观察者模式有关的代码
// skin_changed_observer_.Broadcast(param);
}
}