学无止境

人生的第10000天

MFC程序实现xp UI风格二法(2012/10/12)

参考:
http://www.cnblogs.com/pkill/archive/2010/07/09/1774527.html
http://wutiam.net/2009/08/manifest-dependencies-in-visual-studio-2005/

总结如下:
1、自动生成XXX.exe.manifest文件
1)编写内容。程序使用unicode字符集,stdafx.h 中加入
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'"")
#else
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")
#endif
#endif

若要取消unicode限定,只需修改为:
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'"")
#else
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")
#endif

注:这些语句也可不写在stdafx.h中,直接在 “工程属性页-》清单工具-》输入输出 -》附加清单文件”中添加内容。
对应X86就添加:
type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'
不过可能灵活性可能不够。

2)然后就是一些设置:
☆ 工程属性页-》清单工具-》输入输出
嵌入清单:  是
输出清单文件:  $(IntDir)$(TargetName)$(TargetExt).embed.manifest 
清单资源文件: $(IntDir)$(TargetName)$(TargetExt).embed.manifest.res
☆ 链接-》清单文件-》生成清单文件 设为“是”
这样清单文件就会嵌入到exe文件中,单独执行exe就可以实现xp风格。

或者,也可以设置“嵌入清单”为“否”
这样就会单独生成个“程序名.exe.manifest"文件,只有与exe文件放在同一目录下,
才能实现xp风格。发布时需要同时带上.manifest文件。

2、自己创建并引入一个.manifest文件资源

1) 创建一个.manifest文件的资源.
在res/文件夹下创建一个跟以程序名加.manifest的文件, 如果程序为test.exe, 则创建test.exe.manifest
文件内容同上面生成的.manifest文件:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' />
    </dependentAssembly>
  </dependency>
</assembly>

注意要使用utf-8编码保存。

2) 将新定义的资源加入到.rc2文件中, 类型设为24.
打开res/文件夹下的.rc2文件, 在其中加入如下定义:

1 24 MOVEABLE PURE "res/test.exe.manifest"

其中的文件地址按1)步中修改的设置即可.注意资源ID值一定要为1,当然可用定义为1的宏表示。

之后编译即可, 为了使程序界面可能充分利用系统的界面特性, 可以将界面字体设置为TrueType类型的, 利用Windows XP等系统的屏幕字体平滑特性.







posted on 2012-10-12 11:06 leafcloudsky 阅读(579) 评论(0)  编辑 收藏 引用 所属分类: MFC


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

本博客做为个人工作,生活,学习记录。多为个人经验,感想,不保证正确性。请酌情参考。

导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜