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