这几日看DSkinLite美化界面,看那全英文的DSkinLite_help 技术文档,看到我想吐.
最终还是弄明白了一点点.写出来权当作笔记.
DSkinLite是一个非常强大的库,用来开发应用程序界面.它是一个精简的gui库,用xml文件描术window的皮肤.它支持大多数window的控件,同时也具有一些自己的特色.
主要的特色:
1. DSkinLite是一个精简的库,因为它不是用hook的方法,只是像mfc里的SubclassWindow一样替换程序.所以对应用程序的影响是很小的.
2. DSkinLite用xml文件定义gdi资源,描术如何draw一个window.这样就把UI(user interface用户接口<界面>)和程序逻辑分离开,用户可以很方便地改变程序皮肤.
3. DSkinLite有自己的图形优化库来处理图片.不需要第三方组件.
4. 画图的元素被抽像成线条,文本,矩形和图片.在xml文件中用这些原素来配置window的界面.
5. DSkinLite基于Win32 API,所以它不依赖于其它架构.
6. 支持色彩渐变.
7. 支持在运行时(runtime)改变皮肤.可以在运行时用不同样式的皮肤控制.
8. 支持Unicode
9. 完全支持透明控件,它支持绝大多数的控件透明化,包括子对话框(child dialog)
10. 完全支持弹出菜单,包括非矩形菜单.
11. 支持window的滚动条控件
12. 支持animation(动画).可以用多图片(muti-images)或者单张gif图片来制做animation
13. 支持list control,tree control ,list box
系统要求:
Microsoft windows 2000,me,xp,vista,7
/*****************************************************************************/
dsLoadSkin 函数加载window的皮肤.
BOOL dsLoadSkin( LPCTSTR strSkinPath, int nLoadType );
参数:
strSkinPath
[in] 指向一个以’/0’结束的字符串,指明皮肤的路径.
nLoadType
[in] 指明加载类形,这个参数可以是以下值:
LOAD_FROM_FOLDER
从文件夹加载皮肤文件.
LOAD_FROM_DB
从皮肤数据库加载文件
返回值:
成功返回非零.失败返回零.
dsLoadSkin 函数初始化一个皮肤主题.
需求:
Header: dskinlite.h.
/*******************************************************/
dsExitSkin函数清除资源.
BOOL dsExitSkin(); 参数:无 反回值: 成功返回非零,否则返回零.
dsLoadSkin和dsExitSkin需要成对调用.
需求:
Header: dskinlite.h.
/*******************************************************************/
dsSkinWindow 函数设置window的皮肤
BOOL dsSkinWindow(
HWND hWnd,
UINT uCtrlType,
LPCTSTR szXmlLabel = NULL,
BOOL bChildSkin = TRUE );
参数:
hWnd
[in]窗口句柄
uCtrlType
[in] 窗口类形,在enumWindowType中定义
szXmlLabel
[in] 指定window的标签名,标签名在配置文件xml中定义.如果该参数设为NULL,将使用默认标签名的皮肤来设置window皮肤.
bChildSkin
[in] 指定是否设置子窗口皮肤.
返回值:
成功返回非零,否则返回零.
/***********************************************************************/
使用DSkinLite前当然要先把库下载下来.
以mfc对话框为例.
先建立一个dialog,命名为test并在上面画上需要的控件.确保可以运行.
则
源文件目录为
test/test/
.exe输出目录为
Test/Debug/
一. Copy文件:
然后把dskinliteu.lib(DSkinLite安装目录下lib文件夹中, dskinliteu为unicode版, dskinlite为多字节版), DSkinLite.h, DSkinDef.h这三个文件,copy到dialog源代码目录下(test/test).
在VS2008中设置附加依赖项,方法如下:
选择项目->属性(支接ALT+F7也可以)->配置属性->链接器->输入
在附加依赖项中增加dskinliteu.lib
然后把
Microsoft.VC80.DebugCRT.manifest
Microsoft.VC80.DebugMFC.manifest
dskinliteud.dll
msvcp80d.dll
msvcr80d.dll
(在DSkinLite安装目录下的bin文件夹中)
Copy到test/Debug/中.
把编辑好的xml文件和包含皮肤图片的文件夹放到skin文件夹中,再把skin文件夹copy到test/Debug/中.
二.
在stdafx.h文件中加入如下语句:
#define DSKINDLL_API extern "C" __declspec(dllimport)
#include "DSkinDef.h"
#include "DSkinLite.h"
三.
在CtestApp类的InitInstance()方法中加入
dsLoadSkin(_T("skin"),LOAD_FROM_FOLDER );
就像这样
BOOL CtestApp::InitInstance()
{
…………
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
dsLoadSkin(_T("skin"),LOAD_FROM_FOLDER );
Ctest1Dlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
………
}
然后
int CtestApp::ExitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
dsExitSkin();
return CWinApp::ExitInstance();
}
四:
BOOL Ctest1Dlg::OnInitDialog()
{
…………
dsSkinWindow( GetSafeHwnd(), SKIN_TYPE_DIALOG, NULL, TRUE);
return TRUE; // 除非将焦点设置到控件,否则返回TRUE
}
类似的就oK了,现在用SPY++看一下,OK看不到其它控件了…
DSkinLite的xml文件的编辑
指定xml加载顺序:
有时,如果使用了继承特性,xml文件可能要有顺序的依赖.所以需要指定加载顺序.在skin文件夹放置config.ini文件用来指明加载顺序.
例子:
[xmlindex]
Count=2
1 = “Skin.xml”
2= “inheritDemo.xml”
/*************************************/
<!—这是注释-->
<!—用UTF-8,区分大小写-->
<?xml version="1.0" encoding="UTF-8"?>
<theme version="1.0"><!—theme是根tag(标记) -->
<manifest name="default" folder="GeneralControl" author="xladykiller" />
<!—folder指定皮肤图片的路径,其它是的对theme的描述信息 -->
<dsfont > <!—定义字体,id是标识符 -->
<font id="default" fontface="tahoma" fontsize="11" bold="true"/>
</dsfont>
<dscursor> <!—定义鼠标,id是标识符 -->
<cursor id="handcur" value="hand.cur"/>
</dscursor>
<dscolor><!—定义颜色,id是标识符 -->
<color id="system_bg" value="RGB(201,226,248)" canadjust="false"/>
</dscolor>
<dsimage><!—定义图片 -->
<image id="stardard.button.nor" value="Button.bmp" transparentcolor="RGB(255,0,255)" />
</dsimage>
<dswindow>
<window name="staticicon" type="static">
<!— 定义皮肤标记(window skin label),其中text 的font值是前面的定义的font的标识符id的值加有一个#,-->
<property bkcolor="RGB(255,0,244)" btransparentbk="true" />
<text state="all" font="#default" horzalign="left" vertalign="top" textcolor="RGB(255,0,0)"/>
</window>
</dswindow>
</theme>
需要注意的是:
如调用了如下函数
dsSkinWindow( GetSafeHwnd(), SKIN_TYPE_DIALOG, NULL, TRUE);
其中第二个参数和第三个参数分别为SKIN_TYPE_DIALOG,NULL那么,默认是应用
<window name="dialog" ......
同时,必需还要有一个sysmenu来描述最小化,最大化,闭关三个按钮.
如果在xml没有相应的描述,,而在dsSkinWindow中调用了,,那么程序将无法运行