SOUI界面库 添加 windows系统文件图标皮肤
2018-06-17 23:32:23来源:未知 阅读 ()
最近在学习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来获取具体的图标索引了。
完。。。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:递归与尾递归总结
下一篇:数据结构之通过类模板实现栈
- C++17结构化绑定 2020-05-15
- QT使用LIBS添加绝对路径的dll引用 2019-10-18
- 在C++工程上添加CUDA编译环境 2019-09-17
- C/C++、Qt4实现FTP客户端(有无界面版) 2019-09-17
- 在Visual C++ 6.0中为代码添加行号 2019-08-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash