首页 > 代码库 > DUILIB-编译ZIP皮肤到程序中

DUILIB-编译ZIP皮肤到程序中

为了防止客户随意的修改皮肤文件,可以把皮肤文件打包为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



DUILIB-编译ZIP皮肤到程序中