为了防止客户随意的修改皮肤文件,可以把皮肤文件打包为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
时间: 2024-11-04 19:40:05