为了防止客户随意的修改皮肤文件,可以把皮肤文件打包为ZIP编译到程序中。虽说不能阻止牛掰软件的资源提取,但是防一般的菜鸟客户足矣。
下面是示例代码
#include "resource.h"
//导入的资源类型必须为ZIPRES,和WindowImplBase的定义一致。为所有资源打包,而不要直接打包资源的文件夹
class CDYFrameWnd : public WindowImplBase
{
public:
explicit CDYFrameWnd(LPCTSTR pszXMLPath) :strXMLPath_(pszXMLPath){};
explicit CDYFrameWnd(){};
virtual ~CDYFrameWnd();
virtual LPCTSTR GetWindowClassName()const { return _T("Window"); }
virtual CDuiString GetSkinFile() { return _T("Window.xml"); }
virtual CDuiString GetSkinFolder() { return _T(""); } //为UILIB_ZIPRESOURCE时候用不到,随便实现
virtual void InitWindow();
virtual LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, bool& /*bHandled*/);
virtual void Notify(TNotifyUI& msg);
virtual CControlUI* CreateControl(LPCTSTR pstrClass);
virtual LPCTSTR GetResourceID() const
{
return MAKEINTRESOURCE(IDR_ZIP_SKIN);
};
virtual UILIB_RESOURCETYPE GetResourceType() const
{
return UILIB_ZIPRESOURCE;
};
protected:
CDuiString strXMLPath_;
};
需要注意的是WindowImplBase中是这样载入ZIP资源的,因此资源类型必须为ZIPRES
case UILIB_ZIPRESOURCE:
{
HRSRC hResource = ::FindResource(m_PaintManager.GetResourceDll(), GetResourceID(), _T("ZIPRES"));
if( hResource == NULL )
return 0L;
DWORD dwSize = 0;
HGLOBAL hGlobal = ::LoadResource(m_PaintManager.GetResourceDll(), hResource);
if( hGlobal == NULL )
{
添加后如下
/
//
// ZIPRES
//
IDR_ZIP_SKIN ZIPRES "res\\UIZIP.zip"
代码可以去github获取:
https://github.com/CodeBees/duilib-Ex-Debug/tree/master/Demo/UIZIPExample