VB 实现XP风格窗体`简体中文没有问题`繁体版系统实现不了..求解???

xuli0451392 2013-01-13 11:54:25
Dear 各位朋友:
最近在网上看到一个XP风格窗体。简单实用。并在简体版XP 测试可以正常显示。但当我复制到繁体版怎么搞都不行。求解啊`` 是不是需要修改这个XML文档呢???

下面实例``使用manifest的XML实现...

通过查阅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风格
...全文
338 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
东方之珠 2013-04-08
  • 打赏
  • 举报
回复
24号资源要用VC++的MSDev编译.除了上面这个XML文件外,还需要下面这个API初始化: InitCommonControls.
PctGL 2013-04-07
  • 打赏
  • 举报
回复
在系统本身启用了 XP 外观特效的情况下, 如果显示不出来 xp效果, 99% 的可能性都是24号资源或 AppName.mainfest 配置文件有问题
PctGL 2013-04-07
  • 打赏
  • 举报
回复

<?xml   version="1.0"   encoding="UTF-8"   standalone="yes"?>   
  <assembly   xmlns="urn:schemas-microsoft-com:asm.v1"   manifestVersion="1.0">   
  <assemblyIdentity   
          version="1.0.0.0"   
          processorArchitecture="X86"   
          name="test.exe"   
          type="win32"   
  />   
  <description>WindowsExecutable</description>   
  <dependency>   
          <dependentAssembly>   
                  <assemblyIdentity   
                          type="win32"   
                          name="Microsoft.Windows.Common-Controls"   
                          version="6.0.0.0"   
                          processorArchitecture="X86"   
                          publicKeyToken="6595b64144ccf1df"   
                          language="*"   
                  />   
          </dependentAssembly>   
  </dependency>   
  </assembly> 
$:\windows\WinSxS\x86_xxx..... 文件夹下保存着多个版本的 comctl32.dll 对应多种语言 这些东西: type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" 其实就是在描述你所使用的 comctl32.dll 的路径名,所以这些信息一点都不能错 你用 exescope 打开 explorer.exe 或着系统其他dll,exe的24号资源,看看他们都写的什么,不行的话对比一下 简体中文和繁体中文中 系统程序的 24 号资源 xml的描述字符
Tiger_Zhao 2013-04-05
  • 打赏
  • 举报
回复
如果是所有繁体系统都不能用,才需要怀疑配置文件是否正确。
你现在是部分繁体系统可用、部分不可用,首先应该怀疑系统的设置才对。
几个不可用的繁体系统上桌面外观上有没有选“Windows XP 样式”?
wsrygxfc 2013-04-05
  • 打赏
  • 举报
回复
要实现XP风格的界面,网上下载个XP界面的控件就可以实现!~
现在还是人类 2013-01-19
  • 打赏
  • 举报
回复
我只试验过把这个XML放进VC的资源里,VB的没实验成功,你是怎么放进去的
现在还是人类 2013-01-18
  • 打赏
  • 举报
回复
笔误 test.exe.manifest
现在还是人类 2013-01-18
  • 打赏
  • 举报
回复
据我所知,其他的文件是没有的,通常只要保证文件的编码正确,文件名与应用程序名相同,应该不会有这样的现象,不过有两点还是要注意,1是内容,2是文件名。 比如你的应用程序名为 test.exe ,那么内容可以这么写

<?xml   version="1.0"   encoding="UTF-8"   standalone="yes"?>   
  <assembly   xmlns="urn:schemas-microsoft-com:asm.v1"   manifestVersion="1.0">   
  <assemblyIdentity   
          version="1.0.0.0"   
          processorArchitecture="X86"   
          name="test.exe"   
          type="win32"   
  />   
  <description>WindowsExecutable</description>   
  <dependency>   
          <dependentAssembly>   
                  <assemblyIdentity   
                          type="win32"   
                          name="Microsoft.Windows.Common-Controls"   
                          version="6.0.0.0"   
                          processorArchitecture="X86"   
                          publicKeyToken="6595b64144ccf1df"   
                          language="*"   
                  />   
          </dependentAssembly>   
  </dependency>   
  </assembly> 
文件名改成 test.exe..manifest ,然后这个文件放在与你的 test.exe 相同的目录里就可以了。
舉杯邀明月 2013-01-18
  • 打赏
  • 举报
回复
引用 4 楼 xuli0451392 的回复:
Dear SupermanKing
我试过了``我用记事本编辑``只有UTF-8可以使用,其它的报错,```现在的问题是``繁体的的有些电脑可以使用``有些又不可以```我比对过Comctl32.dll档案``版本什么都是一样的``我把OK的那台机然后复制到不行的上面也一样的结果```。我是想说``是不是还有其它文件???

我觉得应该还是其它文件有点冲突造成不能正常运行的吧。
Comctl32.dll也不是‘独立’运行的,它还会调用其它库呢,如下图:
左下方我用红色框起来的地方,共7个(第2个是它自己),也就是牵涉到另外6个文件。

楼主可不可以试下我的程序能否正常运行于繁体系统啊,我只有简体中文的XP。
你把上图‘另存为……’ *.rar 格式的文件就行了,打开解压,里面就一个可执行程序。
你只要看系统能不能正常启动它就OK了。
xuli0451392 2013-01-17
  • 打赏
  • 举报
回复
Dear SupermanKing 我试过了``我用记事本编辑``只有UTF-8可以使用,其它的报错,```现在的问题是``繁体的的有些电脑可以使用``有些又不可以```我比对过Comctl32.dll档案``版本什么都是一样的``我把OK的那台机然后复制到不行的上面也一样的结果```。我是想说``是不是还有其它文件???
现在还是人类 2013-01-17
  • 打赏
  • 举报
回复
你用记事本另存为,然后最下面有个编码选项,选你的编码格式,如UTF-8,然后保存类型选择所有文件,再覆盖你原来的文件保存看看
xuli0451392 2013-01-16
  • 打赏
  • 举报
回复
Dear SupermanKing <?xml version="1.0" encoding="utf-8" standalone="yes"?> 格式是这个没有错`` 我现在是在繁体版有的电脑上可以显示XP效果``有的不可以``不知道怎回事啊``
现在还是人类 2013-01-13
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="gb2312" standalone="yes"?> <?xml version="1.0" encoding="gbk" standalone="yes"?> <?xml version="1.0" encoding="utf-8" standalone="yes"?> 根据你的指定编码,你需要在保存文本时就按你指定的编码保存。这样才不会出错

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧