VB6编程实现XP风格
有 Windows XP系统后,网上就开始讨论VB6编程实现XP风格。我在编写《股票管理大师》时,在网上收集整理了两种方法。
第一种方法是用manifest文件实现XP风格
用VB6开发的应用程序在Windows XP系统中运行时,只有窗口标题条具备XP风格,窗体上的按钮、文本框等控件仍然显示Windows传统风格。如下图所示:
应用程序是通过一个XML资源文件来通知系统加载具备XP风格的组件。
XML文件的内容如下:
name="XP style manifest"
processorArchitecture="x86"
version="1.0.0.0"
type="win32"/>
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
下面用一个具体例子来说明用此法实现的具体步骤。
1、新建一个VB工程,将工程名称改为:“VB实现XP风格”,启动对象改为:“Sub Main”,将原来的窗体Form1的名称改为“FormVB_XP”。
将上述XML文件内容保存为文件名为“VB实现XP风格.exe.manifest”的文本文件,并将其保存在最终编译出的“VB实现XP风格.exe”文件相同的目录下。
2、添加一个模块,在该模块中输入如下代码:
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
‘VB实现XP风格的初始化函数
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()
InitCommonControlsVB ‘调用初始化函数
FormVB_XP.Show
End Sub
注意初始化动作必须在所有窗体加载前完成。至此,你编译后的VB实现XP风格.exe将具备XP风格,如下图所示:
用这种方法实现XP风格存在如下不足:
1、你的应用程序总有一个manifest文件如影随形,如果这个manifest文件被破坏,XP风格也就不能实现了,VB应用程序当即原形毕露。
2、每次建立新的VB工程时,总不能忘记按照上述步骤去认真地完成,需要写一段也不算长的代码,而且必须在所有窗体调用前就调用初始化函数。
第二种方法是用资源文件实现XP风格
用资源文件实现XP风格是将manifest文件编译到资源文件中,这就克服了用上述方法的两个不足之处。采用这种方法实现XP风格简单可行,不需要写代码,只需要事先准备好一个资源文件,而且可以永久性地使用,也就是说,准备好这个资源文件后,今后新建VB工程时,只要把此资源文件添加进去即可。
因此,准备这个资源文件就是本方法的关键,具体步骤是:
1、将XML文件内容保存为文件名为:“abc.exe.manifest”。
其中的abc.exe可以随意更改,但需要注意的是,保存后要看看其文件长度,其总字节数必须能够被4整除,如果不是,你可以在文件尾加空格。
2、在abc.exe.manifest文件的相同目录下新建一个文本文件,输入如下内容:
1 24 abc.exe.manifest
保存后将文件改名为xp.rc
3、在DOS下进入VB安装目录的Wizard目录(如C:\Program Files\Microsoft Visual Studio\VB98\Wizards),在提示符处输入下行命令:
rc /r d:\vbxp\xp.rc
假设这个xp.rc文件保存的D盘的vbxp目录下。
这样,资源文件xp.res就编译好了。这个编译好的资源文件在我的资源中有下载。
最后说一下需要注意的地方。在Frame内的单选按钮运行后显示为黑色,解决方法是把它们先放入一个PictureBox内,并设置PictureBox的BorderStyle属性为2-None,然后再连同PictureBox一起剪切到一个Frame中。