主要内容
以vs2008为例
我们新建一个MFC工程的时候,Project style默认只有一个选项,下面的Visual style and colors子选项也是不可选的,这个选项就决定了对话框界面的风格。
图0
我们新建完工程之后什么都不做立刻运行,出来的界面就是xp风格的,如图1:
图1
工程的默认字符集默认是unicode的(图2),但写代码的时候,通常,我会习惯用multi-byte set(图3)
图2
图3
将字符集设置从unicode改为multi-byte的时候,再次编译,就会发现界面变了个样子,变成了98风格的界面了(图4)
图4
首先就想,能不能在multi-byte时,也能用xp风格,我就是外貌协会钻石级会员~\(≧▽≦)/~啦啦啦,然后老师跟我说,直接改stadfx.h就可以了。
stadfx.h文件里,最后有一段是这样的:#ifdef _UNICODE......(图5),做法就是直接注释掉第一句#ifdef _UNICODE和最后一句#endif,就可以实现使用multi-byte字符集时,依然能够使用xp界面的风格(图6)
图5
这段代码大概的意思就是,如果使用的是UNICODE字符集,就往下执行,如果处理器是x86架构,就执行xxx配置,如果处理器是IA64架构,就执行xxx配置,如果处理器是x64架构,就执行xxx配置,如果处理器不是以上架构,就执行xxx配置。
图6
如果把这段话全部注释掉,运行的对话框就是98风格的,可见代码上没有设置的时候,最最底层的界面风格还是98的。
网友们还有一种比较普遍的办法就是:
1、 打开一个txt,然后放一段类似配置的文字进去,保存后改名为xxx.mannifest文件
<?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="Microsoft.Windows.WorkSapceName"
type="win32"
/>
<description>Your app 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>
2、 将这个文件放到res文件夹下
3、 在工程目录下添加这个.manifest文件,再运行工程也可以达到同样的效果。
4、 网友的博客上说还要对资源进行下设置,也不知道是什么原因,因为我添加完文件后直接运行无阻碍,运行的对话框也是xp风格的,如果有高手知道,求评论解释。
这个manifest文件的格式跟xml文件是一样的,查阅了一些博文,才知道这其实是个配置文件一样的存在。仔细看下stadfx.h那段代码和manifest文件里的内容,发现有一段是一样的,其实在程序运行的时候,它们做的事情也是一样的,就是执行了同一段代码:
这是manifest文件里的:
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
这是stadfx.h里的:
#pragma comment(linker,"/manifestdependency:\"type='win32'name='Microsoft.Windows.Common-Controls' version='6.0.0.0'processorArchitecture='x86' publicKeyToken='6595b64144ccf1df'language='*'\"")
总结
看到这里会发现执行的这段话里,字段和对应内容都是一样的,所以这两个方法是殊途同归。
总结一下就是:直接改stadfx.h非常方便,在操作简易度上完胜添加manifest文件的方法。
延伸阅读
如果想了解关于manifest文件的原理,推荐看看以下博文:
http://lanhy2000.blog.163.com/blog/static/43678608201152204254242/
疑问
1、 以上这两种调用方法的不同与优劣
2、 为什么默认设置用户如果用multi-byte字符集就显示98风格的界面,这样的默认设置是出于什么考虑