首页 > 代码库 > SOUI界面库 添加 windows系统文件图标皮肤

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系统文件图标皮肤