程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> SOUI界面庫 添加 windows系統文件圖標皮膚,souiwindows

SOUI界面庫 添加 windows系統文件圖標皮膚,souiwindows

編輯:C++入門知識

SOUI界面庫 添加 windows系統文件圖標皮膚,souiwindows


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

 

 

完。。。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved