SOUI介面庫 添加 windows系統檔案表徵圖皮膚

來源:互聯網
上載者:User

標籤:實現   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系統檔案表徵圖皮膚

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.