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来获取具体的图标索引了。

完。。。

时间: 2024-12-29 04:07:23

SOUI界面库 添加 windows系统文件图标皮肤的相关文章

封装:Windows系统文件图标

原文:封装:Windows系统文件图标 用途:用于获取文件系统默认图标 using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace HebianGu.ComLibModule.API { /// <summary>

几款国产开源的Windows界面库

上次介绍的几款图形界面库http://blog.okbase.net/vchelp/archive/23.html都是国外的开源项目,今天介绍的几款都是国人的开源项目,大部分是采用DirectUI设计思想. 1.  炫彩界面库XCGUI 炫彩界面库不仅是界面库,它是软件界面开发框架,让用户开发桌面软件变的简单高效,它功能丰富, 小巧,安全(所有界面元素无句柄),Unicode字符编码,完善的帮助文档; 并且提供了UI设计器,支持XML布局,CSS样式表,XML资源;该库采用C语言开发,速度更快,

图形界面库Windows Forms MFC WTL WxWidgets Qt GTK 综合比较

图形界面库Windows Forms. MFC.WTL. WxWidgets.Qt.GTK 综合比较见下表: 总结: GTK+主要用在X Window上,整个设计的架构和许多概念和MFC以及一般 Windows 上的程序开发大异其趣,入门门槛较高,而且最主要的特色是,它用不具有物件功能的纯C 语言,模拟物件导向.所以写起来比较复杂艰涩,而且充满大量巨集,使用和除错都不是很容易,但优点则是可以用C,不需C++,如果和Win32 SDK比较,不会难学多少,缺点是不易上手使用,而且文件比较缺,架构又非

常见MFC UI界面库[转]

Xtrme toolkit,BCGControlBar,SkinMagic,AppFace,Skin++,Uskin++,SYGUI,LibUIDK,GuiToolkit,GardenUI等等,除了后两种一个是开源,一个是免费的外,其余的都是收费的. The Ultimate Toolbox http://www.codeproject.com/KB/MFC/UltimateToolbox.aspx GuiToolkit(开源,mfc扩展框架,类似Visual Studio 2003风格)htt

各种界面库介绍及比較

具体界面库列表见http://home.pacbell.net/atai/guitool/ 怎样选择界面库 产品易用性 是否easy整合到现有应用程序中?是否easy在新的应用程序项目中应用? 开发者是否能及时掌握并使用 产品稳定性 是否有足够多的演示样例演示控件库各个方面的功能特性 是否有众多的成功案例 是否一直有持续更新 界面库高效性 拖拽窗体,观察是否有明显的停顿感. 可在一个系统下,找一些知名软件比較,如QQ/MSN等.假设有明显差异 拖拽窗体,观察界面控件是否有明显闪烁 . 软件启动速

C++界面库(十几种,很全),当然Delphier有FMX

刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG  Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自己写的界面库,开始对于C++软件界面美化有了一点点的心得.不敢藏私,希望和一些新手朋友们分享交流. 一.  开源C++界面库 1.RingSdk Ringsdk是CSDN上一个前辈自己写的界面库,这个界面库很轻而易举实现QQ2009的界面效果.链接见 http://blog.csdn.net/rin

MFC BCGCBProInc.h : No such s file or dictionary. 解决方案:安装BGB界面库

BCGCBProInc.h : No such s file or dictionary. 解决方案:安装BGB界面库 一.   关于BCGControlBar. BCGControlBar是一个基于MFC的扩展库,您可以通过完全的用户化操作构成一些类似于Microsoft Office 2000/XP/2003和Microsoft Visual Studio.NET的应用程序(用户工具栏.菜单.键盘等等).BCGControlBar库包含了大约150多个经过精心设计,测试和具有完备文档的MFC

MFC界面库

http://blog.csdn.net/cddchina/article/details/38759485 刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG  Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自己写的界面库,开始对于C++软件界面美化有了一点点的心得.不敢藏私,希望和一些新手朋友们分享交流. 一.  开源C++界面库 1.RingSdk Ringsdk是CSDN上一个前辈自己写的界

DuiLib DirectUI 界面库

国内首个开源 的directui 界面库,开放,共享,惠众,共赢,遵循bsd协议,可以免费用于商业项目,目前支持Windows 32 .Window CE.Mobile等平台. Duilib 是一款强大的界面开发工具,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率.提供所见即所得的开发工具UIDesigner.使用DirectUI后将使得我们的设计人员彻底解 放,不会受到开发的束缚,可以充分地发挥其设计能力来设计软件界面,并参与到用户界面开发过程中. Duilib 目前支持Win