首页 > 编程 > Visual Basic > 正文

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

2023-06-12 12:11:35
字体:
来源:转载
供稿:网友

  网上讨论编程实现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所示:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表