SOUI界面库 添加 windows系统文件图标皮肤
最近在学习soui界面库。其中有用到SListCtrl这个控件来现在文件信息。控件用法基本上和mfc 的CListCtrl差不多。也支持图标显示。但是图标是要自己加入图标图片的。这个就有点不好弄。于是我就自己实现了 windows系统文件图标 的skin 皮肤。不多说了 ,直接上代码。
#ifndef __WINFILE_ICON_SKIN_HPP_
#define __WINFILE_ICON_SKIN_HPP_ #include "core/SSkinObjBase.h"
#include <commoncontrols.h>
//************************************
// 这个是 系统文件图标 的皮肤控件。 使用SHGetFileInfo 来获取图标索引
// 使用之前先 注册 theApp->RegisterSkinFactory(TplSkinFactory<SSkinSystemIconList>()); //注册Skin
// 然后在skin.xml 里 添加 资源 <sysiconlist name="sysiconlist" flag="1" /> flag 表示图标大小类型 这个必须要有
//
//************************************
class SSkinSystemIconList: public SSkinObjBase
{
SOUI_CLASS_NAME(SSkinSystemIconList, L"sysiconlist") public:
SSkinSystemIconList()
: m_hIconList(NULL)
{ }
virtual ~SSkinSystemIconList()
{
if(NULL != m_hIconList)
{
((IImageList*)m_hIconList)->Release();
m_hIconList = NULL;
}
} virtual SIZE GetSkinSize()
{
return m_szSimpleIcon;
}
protected:
virtual void _Draw(IRenderTarget *pRT, LPCRECT rcDraw, DWORD dwState,BYTE byAlpha)
{
if(NULL == m_hIconList)
return ; HICON hIcon = NULL;
((IImageList*)m_hIconList)->GetIcon(dwState, ILD_NORMAL, &hIcon);
if(NULL != hIcon)
{
pRT->DrawIconEx(rcDraw->left, rcDraw->top, hIcon, rcDraw->right-rcDraw->left, rcDraw->bottom-rcDraw->top, DI_NORMAL);
DestroyIcon(hIcon);
hIcon = NULL;
}
}
private:
HIMAGELIST* m_hIconList;
SIZE m_szSimpleIcon; SOUI_ATTRS_BEGIN()
ATTR_CUSTOM(L"flag", OnAttrFlag) //XML文件中指定的图片资源名,(type:name) flag 表示图标类型 有small large
SOUI_ATTRS_END()
protected:
LRESULT OnAttrFlag(const SStringW &strValue,BOOL bLoading)
{
int nRet=;
::StrToIntExW(strValue, STIF_SUPPORT_HEX, &nRet); //#define SHIL_LARGE 0 // normally 32x32
//#define SHIL_SMALL 1 // normally 16x16
//SHIL_EXTRALARGE获取48 * 48的图标, SHIL_JUMBO 获取256 * 256的图标。
HRESULT hResult = ::SHGetImageList(nRet , IID_IImageList, (void**)&m_hIconList);
if(S_OK != hResult)
return S_FALSE; //计算图标大小
int nX = ;
int nY = ;
((IImageList*)m_hIconList)->GetIconSize(&nX, &nY);
m_szSimpleIcon.cx = nX;
m_szSimpleIcon.cy = nY; return S_OK;
}
};
//////////////////////////////////////////////////////////////////////////
#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系统文件图标皮肤的更多相关文章
- 封装:Windows系统文件图标
原文:封装:Windows系统文件图标 用途:用于获取文件系统默认图标 using System; using System.Collections.Generic; using System.Dra ...
- 几款国产开源的Windows界面库
上次介绍的几款图形界面库http://blog.okbase.net/vchelp/archive/23.html都是国外的开源项目,今天介绍的几款都是国人的开源项目,大部分是采用DirectUI设计 ...
- 仿迅雷播放器教程 -- C++ windows界面库对比(11)
从上一篇文章中可以看出,C++的界面方向还很弱,没有任何一个界面库可以一统天下,所以才造成了界面库百家争鸣的情况. 从时间上看: 1.出来最早的是QT,1991年就有了. 2.VC++ 虽然1992年 ...
- Windows ->> Windows Server 2012打开管理添加“我的电脑”桌面图标途径
Windows Server 2012打开管理添加“我的电脑”桌面图标途径 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
- 37.qt quick- 高仿微信实现局域网聊天V3版本(添加登录界面、UDP校验登录、皮肤更换、3D旋转)
1.版本介绍(已上传至群里) 版本说明: 添加登录界面. UDP校验登录. 皮肤更换. 3D旋转(主界面和登录界面之间切换) . 效果图如下所示: 如果效果图加载失败,可以去哔哩哔哩 https:// ...
- VC UI界面库大集合
Guitoolkit http://www.beyondata.com/pwc.html The Ultimate Toolbox http://www.codeproject.com/KB/MFC/ ...
- 开源的DirectUI界面库
1. duilib简介 duilib是一个开源的DirectUI界面库,简洁但是功能强大.而且还是BSD的license,所以即便是在商业上,大家也可以安心使用.现在大家可以从这个网站获取到他们所有的 ...
- JUCE 界面库显示中文乱码问题
JUCE 界面库显示中文乱码问题 环境: Windows7 64位 旗舰版 Visual Studio Ultimate 2012 JUCE 4.1 问题描述: 直接使用juce::String存储中 ...
- C++界面库
刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自 ...
随机推荐
- UVA1601 The Morning afther Halloween
题目大意 w h (w, h <= 16)的网格有 n ( n <= 3) 个小写字母(代表鬼)其余的是‘#’(代表障碍格) 或 ‘ ’(代表空格. 要求把他们移动到对应的大写字母里.每步 ...
- changing permissions of Read-only file system in linux
up vote 2 down vote favorite 1 i use this command to make a bootable flash disk of linux mint sudo ...
- ASP.NET 4 and Visual Studio 2010
https://msdn.microsoft.com/en-us/library/ee532866.aspx The topics in this section provide informatio ...
- JSP-Runoob:JSP 表单处理
ylbtech-JSP-Runoob:JSP 表单处理 1.返回顶部 1. JSP 表单处理 我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理.浏览器中使用 GET 和 POST 方法 ...
- Timer A UP mode 中断
Timer_A, Toggle P1.0, CCR0 Up Mode ISR, DCO SMCLK // Description: Toggle P1.0 using software and TA ...
- 搭建Git服务器(转载)
转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360 ...
- PCB CS架构(工程系统)实现单点登入方法
社会的不断进步发展,分工也越来越细了.而我们工作接触的范围也越来越狭小了,但这不是倒退了,而是分工之细让人们在各个方面深耕细作.PCB企业软件系统发展路线同样也如此,随着我们PCB企业发展不断壮大,软 ...
- Tyvj1305最大子序和(单调队列优化dp)
描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7当m=2或m=3时,S=5+1=6 输入 ...
- [Swift通天遁地]五、高级扩展-(13)图片资源本地化设置:根据不同的语言环境显示不同语言版本图片
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密
一.先看一个简单加密,解密实现 1.1 加密 /** * content: 加密内容 * slatKey: 加密的盐,16位字符串 * vectorKey: 加密的向量,16位字符串 */ publi ...