资源管理
- 在SOUI系统中,资源文件通过一个统一的接口对象读取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
namespace SOUI { enum BUILTIN_RESTYPE { RES_PE=0, RES_FILE, }; /** * @struct IResProvider * @brief ResProvider对象 * * Describe 实现各种资源的加载 */ struct IResProvider : public IObjRef { /** * Init * @brief 资源初始化函数 * @param WPARAM wParam -- param 1 * @param LPARAM lParam -- param 2 * @return BOOL -- true:succeed * * Describe every Resprovider must implement this interface. */ virtual BOOL Init(WPARAM wParam,LPARAM lParam) =0; /** * HasResource * @brief 查询一个资源是否存在 * @param LPCTSTR strType -- 资源类型 * @param LPCTSTR pszResName -- 资源名称 * @return BOOL -- true存在,false不存在 * Describe */ virtual BOOL HasResource(LPCTSTR pszType,LPCTSTR pszResName)=0; /** * LoadIcon * @brief 从资源中加载ICON * @param LPCTSTR pszResName -- ICON名称 * @param int cx -- ICON宽度 * @param int cy -- ICON高度 * @return HICON -- 成功返回ICON的句柄,失败返回0 * Describe */ virtual HICON LoadIcon(LPCTSTR pszResName,int cx=0,int cy=0)=0; /** * LoadBitmap * @brief 从资源中加载HBITMAP * @param LPCTSTR pszResName -- BITMAP名称 * @return HBITMAP -- 成功返回BITMAP的句柄,失败返回0 * Describe */ virtual HBITMAP LoadBitmap(LPCTSTR pszResName)=0; /** * LoadCursor * @brief 从资源中加载光标 * @param LPCTSTR pszResName -- 光标名 * @return HCURSOR -- 成功返回光标的句柄,失败返回0 * Describe 支持动画光标 */ virtual HCURSOR LoadCursor(LPCTSTR pszResName)=0; /** * LoadImage * @brief 从资源加载一个IBitmap对象 * @param LPCTSTR strType -- 图片类型 * @param LPCTSTR pszResName -- 图片名 * @return IBitmap * -- 成功返回一个IBitmap对象,失败返回0 * Describe 如果没有定义strType,则根据name使用FindImageType自动查找匹配的类型 */ virtual IBitmap * LoadImage(LPCTSTR pszType,LPCTSTR pszResName)=0; /** * LoadImgX * @brief 从资源中创建一个IImgX对象 * @param LPCTSTR strType -- 图片类型 * @param LPCTSTR pszResName -- 图片名 * @return IImgX * -- 成功返回一个IImgX对象,失败返回0 * Describe */ virtual IImgX * LoadImgX(LPCTSTR pszType,LPCTSTR pszResName)=0; /** * GetRawBufferSize * @brief 获得资源数据大小 * @param LPCTSTR strType -- 资源类型 * @param LPCTSTR pszResName -- 资源名 * @return size_t -- 资源大小(byte),失败返回0 * Describe */ virtual size_t GetRawBufferSize(LPCTSTR pszType,LPCTSTR pszResName)=0; /** * GetRawBuffer * @brief 获得资源内存块 * @param LPCTSTR strType -- 资源类型 * @param LPCTSTR pszResName -- 资源名 * @param LPVOID pBuf -- 输出内存块 * @param size_t size -- 内存大小 * @return BOOL -- true成功 * Describe 应该先用GetRawBufferSize查询资源大小再分配足够空间 */ virtual BOOL GetRawBuffer(LPCTSTR pszType,LPCTSTR pszResName,LPVOID pBuf,size_t size)=0; /** * CheckResUsage * @brief 获得资源内存块 * @param const SMap<SStringT,int> & mapResUsage -- 资源使用计数MAP * @return void * Describe debug版中检查资源的使用情况 */ #ifdef _DEBUG virtual void CheckResUsage(const SMap<SStringT,int> & mapResUsage){} #endif }; }//namespace SOUI |
- 这个接口的实现类通过实现这些既定接口来完成图标(
HICON
),光标(HCURSOR
),位图(HBITMAP
),一般图片(IBitmap
)的解码,同时也提供原始数据(RawData
)的读取。 - 在SOUI系统中内置了两种类型的资源加载(
ResProvider
)模块:SResProviderPE
和SResProviderFiles
,同时也通过外置组件的形式提供了从ZIP文件加载资源的功能。- 为了能够从PE的资源数据段中加载资源,我们需要将
uires.idx
中索引的文件转换成PE资源可以识别的资源类型+资源名(不是资源ID)的形式 - 为了达到这个目的,我们只需要在VS的资源文件中(
.rc
)将SOUI的资源中定义的文件按照uires.idx
定义的类型和名称加进去即可
- 为了能够从PE的资源数据段中加载资源,我们需要将
- 资源加载成功后,调用
SApplication::AddResProvider(IResProvider *)
接口将创建的资源加载器交给SOUI系统管理SApplication::AddResProvider
可以调用多次,便于加载不同的资源
Utilities dll
- utilities之所以默认只提供DLL编译是因为SString类是由utilities实现的
1 2 3 4 5 6 7 8 9 10 |
template <class tchar, class tchar_traits> class TStringT { public: typedef tchar _tchar; typedef const _tchar * pctstr; protected: tchar* m_pszData; // pointer to ref counted string data }; |
1 2 3 4 5 6 7 8 9 10 |
#ifdef UTILITIES_EXPORTS # define EXPIMP_TEMPLATE #else # define EXPIMP_TEMPLATE extern #endif #pragma warning (disable : 4231) EXPIMP_TEMPLATE template class UTILITIES_API TStringT<char, char_traits>; EXPIMP_TEMPLATE template class UTILITIES_API TStringT<wchar_t, wchar_traits>; |
- 通过将string类导出,保证string的所有运行代码都是在utilities这个模块内部,这也就保证了string对象的唯一成员变量:
tchar* m_pszData;
的内存分配及释放固定在utilities这个模块里。- 通过这样处理,无论用户定义string是在哪一个模块,真正的内存管理还是在utilities里,从而使得string对象可以方便的在不同模块之间传递。
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Spdlog记述:四09/16
- ♥ Spdlog记述:三07/23
- ♥ 51CTO:C++编程技巧与规范08/01
- ♥ Soui五05/30
- ♥ Soui应用 动画一06/24
- ♥ C++标准库_chrono03/28