最近在学习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系统文件图标皮肤的更多相关文章

  1. 封装:Windows系统文件图标

    原文:封装:Windows系统文件图标 用途:用于获取文件系统默认图标 using System; using System.Collections.Generic; using System.Dra ...

  2. 几款国产开源的Windows界面库

    上次介绍的几款图形界面库http://blog.okbase.net/vchelp/archive/23.html都是国外的开源项目,今天介绍的几款都是国人的开源项目,大部分是采用DirectUI设计 ...

  3. 仿迅雷播放器教程 -- C++ windows界面库对比(11)

    从上一篇文章中可以看出,C++的界面方向还很弱,没有任何一个界面库可以一统天下,所以才造成了界面库百家争鸣的情况. 从时间上看: 1.出来最早的是QT,1991年就有了. 2.VC++ 虽然1992年 ...

  4. Windows ->> Windows Server 2012打开管理添加“我的电脑”桌面图标途径

    Windows Server 2012打开管理添加“我的电脑”桌面图标途径 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0

  5. 37.qt quick- 高仿微信实现局域网聊天V3版本(添加登录界面、UDP校验登录、皮肤更换、3D旋转)

    1.版本介绍(已上传至群里) 版本说明: 添加登录界面. UDP校验登录. 皮肤更换. 3D旋转(主界面和登录界面之间切换) . 效果图如下所示: 如果效果图加载失败,可以去哔哩哔哩 https:// ...

  6. VC UI界面库大集合

    Guitoolkit http://www.beyondata.com/pwc.html The Ultimate Toolbox http://www.codeproject.com/KB/MFC/ ...

  7. 开源的DirectUI界面库

    1. duilib简介 duilib是一个开源的DirectUI界面库,简洁但是功能强大.而且还是BSD的license,所以即便是在商业上,大家也可以安心使用.现在大家可以从这个网站获取到他们所有的 ...

  8. JUCE 界面库显示中文乱码问题

    JUCE 界面库显示中文乱码问题 环境: Windows7 64位 旗舰版 Visual Studio Ultimate 2012 JUCE 4.1 问题描述: 直接使用juce::String存储中 ...

  9. C++界面库

    刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG  Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自 ...

随机推荐

  1. Android BroadcastAnyWhere(Google Bug 17356824)漏洞具体分析

    Android BroadcastAnyWhere(Google Bug 17356824)漏洞具体分析 作者:简行(又名 低端码农) 继上次Android的LaunchAnyWhere组件安全漏洞后 ...

  2. mySql学习笔记:比sql server书写要简单

    在学mySql.总的感觉,mySql与Sql Server差不多,语法都很象,但mySql也许是吸取了SQL SERVER的一些经验,SQL语句书写起来更加简单. 比如说,设置主键.索引,SQL SE ...

  3. Ned的难题

    题目描述 Ned再也看不下去Robert的种种恶习,于是他决定出一道题来让他醒悟. Ned的题目是这样: 给出一个有n个数的序列,求其中所有连续子序列的数的最大公因数的乘积模1000000009的值. ...

  4. 一、Linux文件权限与目录配置

    行文结构如下: 用户和用户组 Linux文件权限概念 Linux目录配置 重点回顾 1.用户与用户组 Linux是个多用户.多任务的系统,可能有多人同时使用这台机器进行工作,为了考虑每个人的隐私和工作 ...

  5. LVS上DR和NAT模式的缺陷

    引言 相信一般的小公司用的最多的还是DR和NAT模式,关于DR和NAT模式的原理请看看下图,我们先从lvs的DR和NAT模式特性聊聊一些问题. 问题1.lvs的DR模式和NAT模式核心缺陷有哪些? D ...

  6. Countries in War(强连通分量及其缩点)

    http://poj.org/problem?id=3114 题意:有n个城市,m条边,由a城市到b城市的通信时间为w,若a城市与b城市连通,b城市与a城市也连通,则a,b城市之间的通信时间为0,求出 ...

  7. nodejs在windows下的安装

    Windowv 上安装Node.js Windows 安装包(.msi) : 32 位安装包下载地址 : http://nodejs.org/dist/v0.10.26/node-v0.10.26-x ...

  8. [Swift通天遁地]九、拔剑吧-(2)在项目中使用大量美观的图标

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  9. eclipse下整合springboot和mybatis

    1.新建maven项目 先新建一个maven项目,勾选上creat a simple project,填写groupid,artifactid 2.建立项目结构 3.添加依赖 <parent&g ...

  10. ajax 以json 的形式来传递返回参数的实例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestWcf.aspx.c ...