随笔 - 14  文章 - 0  评论 - 12  阅读 - 21778
  2010年3月2日

这几日看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中调用了,,那么程序将无法运行.

 

本文出处:http://blog.csdn.net/xladykiller/archive/2010/02/11/5306808.aspx

posted @ 2010-03-02 15:30 小林子! 阅读(1820) 评论(1) 推荐(0)
  2009年5月13日
摘要: 多行注释(/** */):/??[ ^t]++^p[ ^t]++?[ ^t]*^p++[ ^t]++?/$ 阅读全文
posted @ 2009-05-13 11:09 小林子! 阅读(251) 评论(0) 推荐(0)
  2009年4月28日
摘要: 格式转换sql函数convert(nvarchar(12),@date,111): 第一个参数代表要截取的长度,第二个参数代表数据库的字段,最后一个参数代表要截取的日期时间格式,如下表所示: DATE 日期格式 格式 # 查询 (current date: 12... 阅读全文
posted @ 2009-04-28 09:20 小林子! 阅读(1145) 评论(0) 推荐(0)
  2009年4月15日
摘要: 每次逛书店,都止不住好奇心,关于IT的形形色色自己都非常感兴趣,也因此买了不少的书籍,后来,有一部分读完了,有一部分甚至一直被束之高阁,想想真是惭愧,这两天重温97版天龙八部,其中有一出,鸠摩智到天龙寺索取六脉神剑秘籍,在看到鸠摩智学百家,精百家的精彩表演之后,四位师叔对面前的3本少林秘籍都有所垂涎,后来还是师叔厉害,道出了问题的关键,意思大概是说,我们大理段氏看家本领应该是一阳指,而我... 阅读全文
posted @ 2009-04-15 00:13 小林子! 阅读(377) 评论(0) 推荐(0)
  2009年3月25日
摘要: 最近做了一些自定义控件的开发工作,虽然遇到一些困难,但是感觉自定义控件的开发在某些时候还是很有好处的,然后就想写一个关于自定义控件开发的系列文章,一是给自己做个备忘;二是把遇到的问题记录下来,希望后来者能少走弯路。 本系列希望通过对实例的讲解,能包含自定义控件开发的大部分内容。 在系列(一)中先介绍一个简单的实例,在网上看到一个很经典的入门级自定义控件的开发,本文即以此为例。 1、需求:含有换行的... 阅读全文
posted @ 2009-03-25 01:46 小林子! 阅读(576) 评论(1) 推荐(0)
  2009年2月11日
摘要: 索引器 索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。 在下面的示例中,定义了一个泛型类,并为其提供了简单的 get 和 set 访问器方法(作为分配和检索值的方法)。Program 类为存储字符串创建了此类的一个实例。 Code highlighting produced by Actipro CodeHighlighter (fre... 阅读全文
posted @ 2009-02-11 08:21 小林子! 阅读(1013) 评论(2) 推荐(0)
摘要: sealed 修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override(C# 参考) 一起使用。 在类声明中使用 sealed 修饰符可防止继承此类,例如: Code highlighting produced by Actipro CodeHighlighter... 阅读全文
posted @ 2009-02-11 07:57 小林子! 阅读(858) 评论(0) 推荐(0)
  2009年2月10日
摘要: 存储过程大体上是相同的,但也有一些差别: 1. 存储过程往往实现的功能较复杂,而函数在功能上一般都是很有针对性的; 2. 返回值:函数只能返回一个值,可以是表变量;而存储过程的返回值个数没有什么限制; 3. 函数的限制比较多,不能用临时表,只能用表变量; 4. 存储过程通常都是作为一个独立的部分来执行的,而函数可以作为查询语句的一部分来调用。函数可以返回表对象,所以通常可以放在sql语句的FROM... 阅读全文
posted @ 2009-02-10 14:45 小林子! 阅读(568) 评论(0) 推荐(0)
摘要: C#中同时存在String与string MSDN中对string的说明: string is an alias for String in the .NET Framework。string是String的别名而已,string是c#中的类,String是Framework的类,C# string 映射为 Framework的 String。如果用string,编译器会把它编译成String,... 阅读全文
posted @ 2009-02-10 14:19 小林子! 阅读(9807) 评论(4) 推荐(5)
  2009年2月9日
摘要: 当控制元素为两个按钮时(全选和取消全选): Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 23 24 25 26 27 28 29 30 31 32 33 34 ... 阅读全文
posted @ 2009-02-09 17:26 小林子! 阅读(2616) 评论(0) 推荐(0)
< 2025年6月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12

金山词霸网页划词
点击右上角即可分享
微信分享提示