| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1101 人关注过本帖, 1 人收藏
标题:[转载]VB编程实现XP风格之终结篇
只看楼主 加入收藏
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏(1)
 问题点数:0 回复次数:14 
[转载]VB编程实现XP风格之终结篇

VB编程实现XP风格之终结篇

南京 宋陈三

(本文发表于《软件报》2006年第17期)网上讨论编程实现XP风格已经很久了,但对于VB编程实现XP风格,却终没有一个完美的解决方案。笔者通过N个日夜的刻苦钻研终于揭开其中奥秘。下面分为三个方面与大家共享之。

一.用manifest文件实现XP风格

正常情况下,在Windows XP系统中,用VB6开发的应用程序只有窗口标题条具备XP风格,窗体上的按钮、文本框等控件仍然显示Windows传统风格。如图1所示:

图片附件: 游客没有浏览图片的权限,请 登录注册


通过查阅MSDN里的Visual Style章节知道,Windows XP通过Comctl32.dll(版本6)来加载具备XP风格的组件,应用程序则通过一个XML资源文件来通知系统来做这些。XML文件的内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <assemblyIdentity 
   name="XP style manifest"  
   processorArchitecture="x86" 
   version="1.0.0.0" 
   type="win32"/>  
  <dependency>  
   <dependentAssembly>  
   <assemblyIdentity 
   type="win32"  
   name="Microsoft.Windows.Common-Controls"  
   version="6.0.0.0"  
   processorArchitecture="x86"  
   publicKeyToken="6595b64144ccf1df"  
   language="*"  
   />  
   </dependentAssembly>  
  </dependency>  
  </assembly>

假设你最终编译的程序名是abc.exe,工作目录是d:\vbxp。复制上述XML内容并保存为文本文件。然后将该文件改名为abc.exe.manifest(注意.txt扩展名要去掉)。在VB程序中,我们要在所有窗体加载之前调用InitCommonControlsEx函数从comctl32.dll(版本6)中对组件类进行初始化。API函数InitCommonControlsEx及相关常数、数据类型的声明如下:

Private Declare Function InitCommonControlsEx Lib "comctl32.dll" _ (iccex As tagInitCommonControlsEx) As Boolean
Private Type tagInitCommonControlsEx
lngSize As Long
lngICC As Long
End Type
Private Const ICC_USEREX_CLASSES = &H200
这里我们编写一个函数封装初始化操作:
Public Function InitCommonControlsVB() As Boolean
On Error Resume Next
Dim iccex As tagInitCommonControlsEx
With iccex
.lngSize = LenB(iccex)
.lngICC = ICC_USEREX_CLASSES
End With
InitCommonControlsEx iccex
InitCommonControlsVB = (Err.Number = 0)
On Error Goto 0
End Function
注意初始化动作必须在所有窗体加载前完成,所以要把相关语句放到Sub Main()中,并设置工程从Sub Main()启动。代码如下:

Sub Main()

InitCommonControlsVB

Form1.Show

End Sub

至此,你编译后的abc.exe将具备XP风格,如图2所示:

图片附件: 游客没有浏览图片的权限,请 登录注册


二.在VB设计时或运行时实现XP风格

读者可能已经注意到,用上述方法实现的XP风格必须在编译成exe文件后才可以显示出来。那么是否可以实现在设计时或运行时的“所见即所得”呢。答案是肯定的。把上面提到的abc.exe.manifest文件改名为vb6.exe.manifest并拷贝到vb6的安装目录下(如C:\Program Files\Microsoft Visual Studio\VB98),然后运行VB6,向窗体上画几个控件试试。再按F5运行程序看看效果。我们可以发现,此时的控件已经具备了XP风格。如图3所示。

图片附件: 游客没有浏览图片的权限,请 登录注册

经笔者测试,此时VB6中的颜色选择框会显示不正常,但你仍然可以通过输入数值来改变颜色。

读者在看完这一部分以后往往会触类旁通,将其他程序的安装目录中也放入manifest文件来使其具备XP风格。但要注意此法并非适用于所有程序。如果这个程序没有对引用组件的初始化操作,那么放入manifest文件后将可能导致该程序无法运行。在VC编译的程序中,MFC在注册窗口类时会调用_AfxInitCommonControls函数来加载comctl32.dll(版本6)。 而VB中的初始化操作需要程序员额外声明,所以要特别注意这一点。

三.让VB实现XP风格“无负担”

用上述方法实现XP风格还有一个遗憾,就是总有一个manifest文件如影随形。VB的程序员们为了使应用程序保持“绿色”而尽量少用ActiveX控件,却为实现XP风格而带上这个累赘的家伙。MSDN告诉VC程序员们可以把manifest文件编译到文件资源中,而VB程序员们照葫芦画个瓢时却得到程序无法运行的结果。

问题出在哪里?接着往下看。

把manifest文件编译进文件资源必须保证其资源ID为CREATEPROCESS_MANIFEST_RESOURCE_ID (即数值1),资源的类型为RT_MANIFEST(即数值24),而此类资源无法用VB资源编辑器直接编译,这是其一;其二,XML文件的第一句就提醒我们”encoding=UTF-8”,所以要把manifest保存为UTF-8编码格式。这里我们要让manifest文件的总字节数能够被4整除。例如你复制XML后得到的manifest文件是690字节,那么你就在文首或文尾补两个空格,使之成为692字节。这样得到的manifest文件就可以编译进资源了。如果不满足此要求,编译出来的文件将会出错(而VC中并无此额外要求)。具体编译方法如下:

在abc.exe.manifest文件的相同目录下新建一个文本文件,输入下行代码:

1 24 abc.exe.manifest

保存后将文件改名为xp.rc。如果您的电脑上装有VC,则直接双击xp.rc文件用VC运行之,然后另存为xp.res(这个另存为不简单,还具有编译功能)。如果没装VC,则从DOS下进入VB安装目录的Wizard目录(如C:\Program Files\Microsoft Visual Studio\VB98\Wizards),在提示符处输入下行命令:

rc /r d:\vbxp\xp.rc

这样,资源文件xp.res就编译好了。打开VB工程文件abc.vbp,按Ctrl +D加入该资源文件,编译生成abcd.exe(这里就不用abc.exe为文件名了,以免混淆),双击运行……。哈哈。大功告成。

最后说一下需要注意的地方。在Frame内的单选按钮运行后显示为黑色,解决方法是把它们先放入一个PictureBox内,并设置PictureBox的BorderStyle属性为2-None,然后再连同PictureBox一起剪切到一个Frame中。

本文提及的方法不仅可以使应用程序内部的控件具备XP风格,也可以使其调用的消息框及ActiveX控件具备XP风格。但要注意,在使用工具栏、进度条等ActiveX控件时要引用Microsoft Windows Common Controls 5.0 版本,否则不能使控件具备XP风格。

为了网友们的方便,我把manifest文件、rc文件、res文件和工程示例放在这里http://www.asanscape.com/vbxp.zip。本文内容在Windows XP+VB6中调试通过。欢迎加入VB技术讨论QQ群12960265,和众多VB爱好者共同进步。



搜索更多相关主题的帖子: 风格 
2006-11-22 15:29
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
没有人对这些东西感兴趣么?

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-11-22 16:54
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 
看过N次..不过也是一看而过.....

我的msn: myfend@
2006-11-22 17:55
Arenz
Rank: 1
等 级:新手上路
帖 子:233
专家分:0
注 册:2006-11-21
收藏
得分:0 

我记得vb还有一个东西可以自行改风格样式?


我在学VB..
2006-11-22 23:00
xinfresh
Rank: 4
等 级:贵宾
威 望:13
帖 子:594
专家分:0
注 册:2006-1-13
收藏
得分:0 
很牛,如果是你自己总结的,在下对你表示敬佩!
不过……现在都在用.NET了,画出来就是XP风格……
没别的意思,与时俱进啊……

E-mail:xinfresh@QQ:383094053校内:http:///getuser.do?id=234719042
2006-11-23 12:40
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
.NET生成的文件比较大吧....

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-11-23 17:43
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 
每一种 东西..都有其优点与缺点..

我的msn: myfend@
2006-11-23 17:55
weiyi75
Rank: 1
等 级:新手上路
威 望:1
帖 子:43
专家分:0
注 册:2006-9-7
收藏
得分:0 
谢谢分享。
2006-11-25 21:17
jackboy
Rank: 2
等 级:论坛游民
帖 子:163
专家分:27
注 册:2005-10-9
收藏
得分:0 
不错啊,不过有了.NET了,也没多大用了,但还是支持一下

2006-11-26 15:15
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
都夸.NET.....知道现在程序大了用的人不会多的...

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-11-27 14:31
快速回复:[转载]VB编程实现XP风格之终结篇
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013350 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved