最近在學習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來獲取具體的圖標索引了。
完。。。