SOUI界面库 添加 windows系统文件图标皮肤
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SOUI界面库 添加 windows系统文件图标皮肤相关的知识,希望对你有一定的参考价值。
最近在学习soui界面库。其中有用到SListCtrl这个控件来现在文件信息。控件用法基本上和mfc 的CListCtrl差不多。也支持图标显示。但是图标是要自己加入图标图片的。这个就有点不好弄。于是我就自己实现了 windows系统文件图标 的skin 皮肤。不多说了 ,直接上代码。
1 #ifndef __WINFILE_ICON_SKIN_HPP_ 2 #define __WINFILE_ICON_SKIN_HPP_ 3 4 #include "core/SSkinObjBase.h" 5 #include <commoncontrols.h> 6 //************************************ 7 // 这个是 系统文件图标 的皮肤控件。 使用SHGetFileInfo 来获取图标索引 8 // 使用之前先 注册 theApp->RegisterSkinFactory(TplSkinFactory<SSkinSystemIconList>()); //注册Skin 9 // 然后在skin.xml 里 添加 资源 <sysiconlist name="sysiconlist" flag="1" /> flag 表示图标大小类型 这个必须要有 10 // 11 //************************************ 12 class SSkinSystemIconList: public SSkinObjBase 13 { 14 SOUI_CLASS_NAME(SSkinSystemIconList, L"sysiconlist") 15 16 public: 17 SSkinSystemIconList() 18 : m_hIconList(NULL) 19 { 20 21 } 22 virtual ~SSkinSystemIconList() 23 { 24 if(NULL != m_hIconList) 25 { 26 ((IImageList*)m_hIconList)->Release(); 27 m_hIconList = NULL; 28 } 29 } 30 31 virtual SIZE GetSkinSize() 32 { 33 return m_szSimpleIcon; 34 } 35 protected: 36 virtual void _Draw(IRenderTarget *pRT, LPCRECT rcDraw, DWORD dwState,BYTE byAlpha) 37 { 38 if(NULL == m_hIconList) 39 return ; 40 41 HICON hIcon = NULL; 42 ((IImageList*)m_hIconList)->GetIcon(dwState, ILD_NORMAL, &hIcon); 43 if(NULL != hIcon) 44 { 45 pRT->DrawIconEx(rcDraw->left, rcDraw->top, hIcon, rcDraw->right-rcDraw->left, rcDraw->bottom-rcDraw->top, DI_NORMAL); 46 DestroyIcon(hIcon); 47 hIcon = NULL; 48 } 49 } 50 private: 51 HIMAGELIST* m_hIconList; 52 SIZE m_szSimpleIcon; 53 54 SOUI_ATTRS_BEGIN() 55 ATTR_CUSTOM(L"flag", OnAttrFlag) //XML文件中指定的图片资源名,(type:name) flag 表示图标类型 有small large 56 SOUI_ATTRS_END() 57 protected: 58 LRESULT OnAttrFlag(const SStringW &strValue,BOOL bLoading) 59 { 60 int nRet=0; 61 ::StrToIntExW(strValue, STIF_SUPPORT_HEX, &nRet); 62 63 //#define SHIL_LARGE 0 // normally 32x32 64 //#define SHIL_SMALL 1 // normally 16x16 65 //SHIL_EXTRALARGE获取48 * 48的图标, SHIL_JUMBO 获取256 * 256的图标。 66 HRESULT hResult = ::SHGetImageList(nRet , IID_IImageList, (void**)&m_hIconList); 67 if(S_OK != hResult) 68 return S_FALSE; 69 70 //计算图标大小 71 int nX = 0; 72 int nY = 0; 73 ((IImageList*)m_hIconList)->GetIconSize(&nX, &nY); 74 m_szSimpleIcon.cx = nX; 75 m_szSimpleIcon.cy = nY; 76 77 return S_OK; 78 } 79 }; 80 ////////////////////////////////////////////////////////////////////////// 81 #endif // __WINFILE_ICON_SKIN_HPP_
先说说怎么使用吧。
1. 最新版的soui界面库里添加了 skin.xml 。所有的图片资源都要在这里添加。
<?xml version="1.0"?> <skin> <sysiconlist name="sysiconlist" flag="1" /> flag 表示图标大小类型 这个必须要有 </skin>
flag这个必须要有。因为系统图标也有好多中。1 表示的是 小图标。具体可以看代码。
//#define SHIL_LARGE 0 // normally 32x32
//#define SHIL_SMALL 1 // normally 16x16
使用之前 要先注册这个皮肤。
SApplication *theApp=new SApplication(NULL, hInstance);
theApp->RegisterSkinFactory(TplSkinFactory<SSkinSystemIconList>()); //注册Skin
然后就可以在 布局 mainwnd.xml 里使用了。使用方法和其他的没有区别。
iconSkin="sysiconlist"
最后再用 SHGetFileInfo来获取具体的图标索引了。
完。。。
以上是关于SOUI界面库 添加 windows系统文件图标皮肤的主要内容,如果未能解决你的问题,请参考以下文章
如何在WTL和MFC中使用duilib及如何静态使用duilib库
(小菜鸟写库)个人为0.95寸OLED写的图形界面库(连载)