现在的位置: 首页 > 综合 > 正文

DSkinLite

2018年03月29日 ⁄ 综合 ⁄ 共 4274字 ⁄ 字号 评论关闭

这几日看DSkinLite美化界面,看那全英文的DSkinLite_help 技术文档,看到我想吐.

最终还是弄明白了一点点.写出来权当作笔记.

 

DSkinLite是一个非常强大的库,用来开发应用程序界面.它是一个精简的gui,xml文件描术window的皮肤.它支持大多数window的控件,同时也具有一些自己的特色.

 

主要的特色:

1.       DSkinLite是一个精简的库,因为它不是用hook的方法,只是像mfc里的SubclassWindow一样替换程序.所以对应用程序的影响是很小的.

2.       DSkinLitexml文件定义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(); 参数: 反回值: 成功返回非零,否则返回零.

dsLoadSkindsExitSkin需要成对调用.

需求:

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文件夹中, dskinliteuunicode, dskinlite为多字节版), DSkinLite.h, DSkinDef.h这三个文件,copydialog源代码目录下(test/test).

VS2008中设置附加依赖项,方法如下:

选择项目->属性(支接ALT+F7也可以)->配置属性->链接器->输入

在附加依赖项中增加dskinliteu.lib

 

然后把

Microsoft.VC80.DebugCRT.manifest

Microsoft.VC80.DebugMFC.manifest

dskinliteud.dll

msvcp80d.dll

msvcr80d.dll

(DSkinLite安装目录下的bin文件夹中)

Copytest/Debug/.

 

把编辑好的xml文件和包含皮肤图片的文件夹放到skin文件夹中,再把skin文件夹copytest/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看不到其它控件了

 

DSkinLitexml文件的编辑

指定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中调用了,,那么程序将无法运行.

抱歉!评论已关闭.