网上讨论编程实现XP风ge已经很久了,但对于VB编程实现XP风ge,却终没有一个完美的解决方案。笔者通过N个日夜的刻苦钻研终于揭开其中奥秘。下面分为三个方面与大家共享之。
点击下载源代码文件
一.用manifest文件实现XP风ge
正常情况下,在Windows XP系统中,用VB6开发的应用程序只有窗口标题条具备XP风ge,窗体上的按钮、文本框等控件仍然显示Windows传统风ge。如图1所示:
通过查阅MSDN里的Visual Style章节知道,Windows XP通过Comctl32.dll(版本6)来加载具备XP风ge的组件,应用程序则通过一个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风ge,如图2所示:
新闻热点
疑难解答