標籤:實現 str info reg false cli system val tom
最近在學習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 SSkinObjBase13 {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 32x3264 //#define SHIL_SMALL 1 // normally 16x1665 //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系統檔案表徵圖皮膚