默认情况下,Vs.net提供的控件即使在WinXp下运行,也不能获得XP风格的界面,因此,FotoVision里加入了一个Manifest文件。这是一个XML文件,这个文件明确指定了窗体控件使用的是版本为6.0Comctl32.dll。这个dll文件中包含了一些新的控件以及一些控件的新特性,它最大的好处是支持控件外观的改变。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

一般将Manifest文件放在可执行文件目录下,命名方法为:<可执行文件名>.exe.manifest,因此我们可以在bin目录下看到FotoVision.exe.manifest。项目中就是通过manifest文件下的ThemeManifest.xmlThemeManifest.cs文件实现的。前者就是能够让应用程序具有XP效果的manifest文件,后者是一个工具类,用于提取ThemeManifest.xml的内容,并写入到可执行文件所在的目录下。因此,当程序第一次运行时,会在同一目录下生成FotoVision.exe.manifest

ThemeManifest.xml

FotoVision学习手记(2)<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>
FotoVision学习手记(2)
<assemblyxmlns="urn:schemas-microsoft-com:asm.v1"manifestVersion="1.0">
FotoVision学习手记(2)
<assemblyIdentity
FotoVision学习手记(2)
version="1.0.0.0"

FotoVision学习手记(2)processorArchitecture
="X86"
FotoVision学习手记(2)name
="PhotoVision"
FotoVision学习手记(2)type
="win32"
FotoVision学习手记(2)
/>
FotoVision学习手记(2)
<description>.NETcontroldeploymenttool</description>
FotoVision学习手记(2)
<dependency>
FotoVision学习手记(2)
<dependentAssembly>
FotoVision学习手记(2)
<assemblyIdentity
FotoVision学习手记(2)
type="win32"

FotoVision学习手记(2)name
="Microsoft.Windows.Common-Controls"
FotoVision学习手记(2)version
="6.0.0.0"
FotoVision学习手记(2)processorArchitecture
="X86"
FotoVision学习手记(2)publicKeyToken
="6595b64144ccf1df"
FotoVision学习手记(2)language
="*"
FotoVision学习手记(2)
/>
FotoVision学习手记(2)
</dependentAssembly>
FotoVision学习手记(2)
</dependency>
FotoVision学习手记(2)
</assembly>
FotoVision学习手记(2)
FotoVision学习手记(2)


对这个文件来说,在不同的应用程序中,只需要修改assemblyIdentity中的name的属性,其他都是一样的,因此可以直接复制过去使用。


ThemeManifest.cs

这是一个工具类,用于提取ThemeManifest.xml的内容,并写入到可执行文件所在的目录下,并且这也解决了当可执行文件拷贝到其他目录下运行时无法具有XP外观的问题。

FotoVision学习手记(2)FotoVision学习手记(2)/**////<summary>
FotoVision学习手记(2)
///ThemeManifest的摘要说明。
FotoVision学习手记(2)
///</summary>

FotoVision学习手记(2)publicsealedclassThemeManifest
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)
privateclassConsts
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)
publicconstStringResourceName="PhotoVision.manifest.ThemeManifest.xml";
FotoVision学习手记(2)}

FotoVision学习手记(2)
privateThemeManifest()
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)
//
FotoVision学习手记(2)
//TODO:在此处添加构造函数逻辑
FotoVision学习手记(2)
//
FotoVision学习手记(2)
}

FotoVision学习手记(2)
publicstaticboolCreate()
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)Stringpath
=System.Windows.Forms.Application.ExecutablePath+".manifest";
FotoVision学习手记(2)
if(File.Exists(path))
FotoVision学习手记(2)
returnfalse;
FotoVision学习手记(2)
try
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)System.Reflection.Assemblyassem
=System.Reflection.Assembly.GetExecutingAssembly();//获取当前执行的程序集
FotoVision学习手记(2)
System.IO.TextReaderreader=newStreamReader(assem.GetManifestResourceStream(Consts.ResourceName));
FotoVision学习手记(2)
FotoVision学习手记(2)Stringxml
=reader.ReadToEnd();
FotoVision学习手记(2)reader.Close();
FotoVision学习手记(2)
FotoVision学习手记(2)StreamWriterwriter
=newStreamWriter(path);
FotoVision学习手记(2)writer.Write(xml);
FotoVision学习手记(2)writer.Close();
FotoVision学习手记(2)
FotoVision学习手记(2)
returntrue;
FotoVision学习手记(2)
FotoVision学习手记(2)}

FotoVision学习手记(2)
catch(System.Exceptionex)
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)System.Diagnostics.Trace.WriteLine(ex.Message.ToString());
FotoVision学习手记(2)
returnfalse;
FotoVision学习手记(2)}

FotoVision学习手记(2)}

FotoVision学习手记(2)}

FotoVision学习手记(2)

并且在Mainform中修改Main()函数如下:

FotoVision学习手记(2)FotoVision学习手记(2)/**////<summary>
FotoVision学习手记(2)
///应用程序的主入口点。
FotoVision学习手记(2)
///</summary>

FotoVision学习手记(2)[STAThread]
FotoVision学习手记(2)
staticvoidMain()
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)
boolowned;
FotoVision学习手记(2)System.Threading.Mutexmutex
=newMutex(true,Application.ProductName+"manifest",outowned);
FotoVision学习手记(2)
if(owned)
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)
if(ThemeManifest.Create())
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){//程序首次运行,生成manifest文件
FotoVision学习手记(2)
System.Diagnostics.Processprocess=Process.Start(Application.ExecutablePath);
FotoVision学习手记(2)
FotoVision学习手记(2)process.WaitForInputIdle();
FotoVision学习手记(2)Application.Exit();
FotoVision学习手记(2)}

FotoVision学习手记(2)
else
FotoVision学习手记(2)Run();
//manifest文件已经存在,直接运行
FotoVision学习手记(2)
mutex.ReleaseMutex();//释放Mutex一次。
FotoVision学习手记(2)
}

FotoVision学习手记(2)
else
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)Run();
FotoVision学习手记(2)}

FotoVision学习手记(2)}

FotoVision学习手记(2)
staticvoidRun()
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)
boolowned;
FotoVision学习手记(2)Mutexmutex
=newMutex(true,Application.ProductName+"single",outowned);
FotoVision学习手记(2)
FotoVision学习手记(2)
if(owned)
FotoVision学习手记(2)FotoVision学习手记(2)
FotoVision学习手记(2){
FotoVision学习手记(2)Application.Run(
newForm1());
FotoVision学习手记(2)mutex.ReleaseMutex();
FotoVision学习手记(2)}

FotoVision学习手记(2)
FotoVision学习手记(2)}

FotoVision学习手记(2)


下图就是使用了

XP风格的FotoVision系统运行后的情形:


FotoVision学习手记(2)

相关文章:

  • 2021-05-27
  • 2022-12-23
  • 2022-02-19
  • 2021-09-11
  • 2021-08-10
  • 2022-02-25
  • 2021-09-25
  • 2021-12-26
猜你喜欢
  • 2021-11-27
  • 2021-10-11
  • 2021-12-07
相关资源
相似解决方案