最近在学习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来获取具体的图标索引了。
完。。。