设置MFC对话框的xp界面风格

本文介绍如何在VS2008的MFC工程中,使对话框保持XP风格,即使字符集设置为multi-byte。主要方法包括修改stadfx.h文件和添加manifest文件,通过注释代码或提供配置来实现界面风格的改变。直接修改stadfx.h文件被评价为更便捷。同时提出了对manifest文件原理和默认设置为98风格原因的疑问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要内容

以vs2008为例

我们新建一个MFC工程的时候,Project style默认只有一个选项,下面的Visual style and colors子选项也是不可选的,这个选项就决定了对话框界面的风格。

图0

图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风格的界面,这样的默认设置是出于什么考虑

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值