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++,等界面库,以及一些网友自 ...
随机推荐
- 又发现2个高人写的Delphi图文并茂的消息研究
http://ymg97526.blog.163.com/blog/static/173658160201139101120862/http://ymg97526.blog.163.com/blog/ ...
- P2495 [SDOI2011]消耗战 虚树
这是我做的第一道虚树题啊,赶脚不错.其实虚树也没什么奇怪的,就是每棵树给你一些点,让你多次查询,但是我不想每次都O(n),所以我们每次针对给的点建一棵虚树,只包含这些点和lca,然后在这棵虚树上进行树 ...
- mysql的启动和停止
1.检查数据库服务器是否开启:任务管理器-->后台进程-->查看mysqld是否存在.存在说明开启了,反之没开启 2.管理员运行cmd,输入重启指令:net start **(**数据库名 ...
- css link的事件与顺序
创建: 2017/10/26 link:连接平常的状态 visited:连接被访问过之后 hover:鼠标放到连接上的时候 active:连接被按下的时候
- E20170623-ts
filter n. 滤波器; 滤光器; 滤色镜; [化] 过滤器; mass n. 大量,大多; 块,堆,团; [物理学] 质量; 弥撒曲; assignment n. 分给,分配; 任务, ...
- npm 与 package.json 快速入门教程
npm 与 package.json 快速入门教程 2017年08月02日 19:16:20 阅读数:33887 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解 ...
- js判断出两个字符串最大子串的函数
<!DOCTYPE html><html><head> <title></title></head><script typ ...
- 如何写出网页高性能的DOM来提升网页的加载速度
为什么要写高性能DOM? 一个网站,在页面上承载最多内容的就是DOM,而且无论是我们通过加载JS.加载图片,他们也是通过写HTML标签来实现的.而我们性能优化要做的无非就是几大块: 站点的网络消耗 D ...
- js将字符串中所有反斜杠\替换成正斜杠/
区分正斜杠与反斜杠: 正斜杠:http://.http紧跟着的斜杠,离手输入最近的斜杠,shift中间斜杠.45度角斜杠.正斜杠不需要转义 反斜杠:回车与空格之间.程序表示时需要转义成\\. str. ...
- JavaScript--二维数组
一维数组,我们看成一组盒子,每个盒子只能放一个内容. 一维数组的表示: myarray[ ] 二维数组,我们看成一组盒子,不过每个盒子里还可以放多个盒子. 二维数组的表示: myarray[ ][ ] ...