在VB.net中,从form启动的windows应用程序的风格默认就是XP的,但是如果设置从Main函数启动windows应用程序的话,界面就会回归成vb6那种难看的风格,那么这种情况下,应该怎么做才能使用XP风格界面呢?
从网上能搜到很多使用xp风格的方法,但是基本上都是以vb6为前提的,都要用到“主程序名.exe.manifest”这个xml配置文件,有的方法非常复杂(我还不会),也有比较方便,但是没有彻底解决问题的,每次重新编译都要再操作一遍的。
其实在vb.net中对于这个问题已经有非常方便的方法存在了,就是使用enableVisualStyles,具体方法如下:
Module main
Sub main()
Application.EnableVisualStyles()
Application.DoEvents()
Application.Run(frmMain)
End Sub
End Module
根据msdn的介绍,最好是在main函数中使用EnableVisualStyles,然后再用application运行窗体。另外,如果控件里有flatstyle属性时(如button,groupbox,checkedbox,radiobutton等),要将该属性改为system。
使用这个方法有一点需要注意,就是一个application中只能使用一次enableVisualStyles,不然会抛出InteropServices.SEHException异常。
-----------------------------------------------------------------------------
下面再介绍下前面提到的比较简单但不彻底的方法:
创建一个.manifest文件。文件必须与目标程序在同一个文件夹(例如你的工程的/bin文件夹),并且名字必须是
MyApp.exe.manifest,其中MyApp是你的程序文件名。文件的内容如下:
<?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="MyApp" type="win32" />
<description>Your application description here.</description>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0"
processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" />
</dependentAssembly>
</dependency>
</assembly>
将MyApp.exe替换为目标程序文件名,version改成你的版本。可以用记事本来建立这个文件。
然后在.net工程中,将窗体的Button、Label的FlatStyle属性设置为System,如下图:
这样,你建立的.net程序就可以呈现XP风格了。
这里就出现了一个问题:无论更改MyApp.exe还是MyApp.exe.manifest的文件名,XP Sytle都会消失。
解决办法就是将manifest文件直接嵌入.exe文件中去。方法是这样的:
用Visual Studio.net打开.exe文件(这里是test_WMPSDK.exe),将会看到下面的东西:
我们给它添加一个资源:
在对话框中,我们找不到manifest类型。没关系,我们使用“导入”来导入:
注意文件类型是“所有文件”。添加完后,要求资源类型,我们写入RT_MANIFEST:
此时完成了资源添加:
还没完,我们还要将资源的ID从101改为1:
这样,保存.exe文件,运行一下看看(此时可以把.manifest文件删掉了):
即使更改.exe文件名,程序仍然可以呈现XP Style。但是还有一个问题。因为资源是后期加入的,所以一旦你的工程重新生成,XP Style又会消失。比较彻底的办法是将manifest文件加入工程的资源当中去。
至于如何把manifest文件加入工程资源,貌似非常复杂,我并没有深究,如果大家有兴趣,这方面的资料网上还是能搜到的。