VC6风格转XP风格界面的两种方法

方法1 无负担的manifest文件

关于让自己的程序界面实现XP风格这个问题,在网上的讨论很多,大多数的作法都是写一个.manifest文件,然后将文件名改一下,比如.exe文件为test.exe,就将这个.manifest文件改名成test.exe.manifest,并将其和test.exe放在同一个目录里,这样test.exe在XP或2003(必须启动Themes服务)下运行时就会呈现XP界面风格。 

有件事情必须说一下,按照上面的方法,test.exe必须先调用InitCommonControls函数(已经废除,不建议使用)或者InitCommonControlsEx函数从comctl32.dll中注册组件类。这一步在VB中是必须的,但是在VC(MFC程序)中,我们好像并没有调用这个函数,可是编译后的程序为什么还能实现XP风格呢?原因是MFC替我们做了这件事。如果我们是让MFC注册的窗口类,它会调用_AfxInitCommonControls函数,而_AfxInitCommonControls的主要操作就是把comctl32.dll装载进来,然后判断.dll文件中有没有InitCommonControlsEx函数,如果有就调用,没有则调用InitCommonControls,到此真相大白。可能有人和我一样,看着以“afx”开头的窗口类名称很不舒服,于是喜欢自己注册窗口类,但在我们注册自己的窗口类时一定要确保调用过InitCommonControlsEx函数,这点一定要记得,如果忘记的话你将会看到一个空白的窗口。 

说了这么多,有点跑题了,呵呵。现在回到正题。我上面提到的方法很多网站上都有介绍,但是却有一个致命的缺点,就是必须有那个.manifest文件如影随形,exe文件到哪,它就得到哪,这当然是我们不愿意看到的。有没有办法能把它“合”到exe文件中呢?答案是肯定的,这也正是本文题目中“无负担”三个字的意思。 

当然了,那个.manifest文件还是要有的,只不过不是和.exe文件放在同一目录中,而是把它放到资源文件中,编译后生成.res文件,link后自然就和.exe文件“合”到一起了。 

首先,请出.manifest文件: 

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>   
  2. <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">   
  3. <assemblyIdentity   
  4.   name="XP style manifest"   
  5.   processorArchitecture="x86"   
  6.   version="1.0.0.0"   
  7.   type="win32"/>   
  8. <dependency>   
  9.   <dependentAssembly>   
  10.     <assemblyIdentity   
  11.       type="win32"   
  12.       name="Microsoft.Windows.Common-Controls"   
  13.       version="6.0.0.0"   
  14.       processorArchitecture="x86"   
  15.       publicKeyToken="6595b64144ccf1df"   
  16.       language="*"   
  17.     />   
  18.   </dependentAssembly>   
  19. </dependency>   
  20. </assembly>   

大家也看到了,这其实是一个XML文件,打开记事本,复制上面的内容,然后存盘,文件名任意,这里我存为XPStyle.manifest。 
然后在VC中新建一个MFC AppWizard(exe)工程,Document/View或Dialog均可,接着把XPStyle.manifest复制到工程所在目录,再用记事本或其它文本编辑工具手动修改工程目录下的资源文件(.rc),在文件最后加上一行: 
[cpp]  view plain copy
  1. 1 24 "XPStyle.manifest"  
在VC中编译并连接工程生成.exe可执行文件,运行一下看看。 
这里我再多解释一下,最后加上的那一行,“1”代表资源ID,必须是“1”。“24”代表资源类型,我想我们对RT_ACCELERATOR、RT_BITMAP、RT_MENU、RT_STRING等资源都非常熟悉,而“24”实际上是RT_MANIFEST。最后面引号中的东西我就不再啰嗦了。 
好了,编译后的这个.exe文件拿到哪都可以,都是XP风格的界面,不用再依赖.manifest文件了。哦,当然了,必须在XP或2003系统下才可以。
我试了一下,方法是可行的,主要是要注意  1 24 “XPStyle.manifest”  放的地方,不然编译器会提示你找不到该文件
我是这么放的
[cpp]  view plain copy
  1. //Microsoft Developer Studio generated resource script.  
  2. //  
  3. #include "resource.h"  
  4.   
  5. #define APSTUDIO_READONLY_SYMBOLS  
  6. /  
  7. //  
  8. // Generated from the TEXTINCLUDE 2 resource.  
  9. //  
  10. #include "afxres.h"  
  11.   
  12. /  
  13. #undef APSTUDIO_READONLY_SYMBOLS  
  14.   
  15.   
  16. /  
  17. // Chinese (P.R.C.) resources  
  18.   
  19. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)  
  20. #ifdef _WIN32  
  21. LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED  
  22. #pragma code_page(936)  
  23. #endif //_WIN32  
  24.   
  25. #ifdef APSTUDIO_INVOKED  
  26.   
  27. 1 24 "XPStyle.manifest"  放这里!  
  28. /  
  29. //  
  30. // TEXTINCLUDE  
  31. //  
  32.   
  33.   
  34. 1 TEXTINCLUDE DISCARDABLE   
  35. BEGIN  
  36.     "resource.h\0"  
  37. END  
  38.   
  39.   
  40. 2 TEXTINCLUDE DISCARDABLE   
  41. BEGIN  
  42.     "#include ""afxres.h""\r\n"  
  43.     "\0"  
  44. END  
  45.   
  46.   
  47. 3 TEXTINCLUDE DISCARDABLE   
  48. BEGIN  
  49.     "#define _AFX_NO_SPLITTER_RESOURCES\r\n"  
  50.     "#define _AFX_NO_OLE_RESOURCES\r\n"  
  51.     "#define _AFX_NO_TRACKER_RESOURCES\r\n"  
  52.     "#define _AFX_NO_PROPERTY_RESOURCES\r\n"  
  53.     "\r\n"  
  54.     "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"  
  55.     "#ifdef _WIN32\r\n"  
  56.     "LANGUAGE 9, 1\r\n"  
  57.     "#pragma code_page(1252)\r\n"  
  58.     "#endif //_WIN32\r\n"  
  59.     "#include ""res\\TISDemo.rc2""  // non-Microsoft Visual C++ edited resources\r\n"  
  60.     "#include ""afxres.rc""         // Standard components\r\n"  
  61.     "#endif\r\n"  
  62.     "\0"  
  63. END  
  64.   
  65. #endif    // APSTUDIO_INVOKED  


方法2 stdafx.h中添加几行文字
在stdafx.h的最后面加上下面的几行代码即可:
[cpp]  view plain copy
  1. //xp样式支持  
  2. #if defined _M_IX86  
  3. #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")  
  4. #elif defined _M_IA64  
  5. #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")  
  6. #elif defined _M_X64  
  7. #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")  
  8. #else  
  9. #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")  
  10. #endif  

对于VC6的项目升级到VS2005环境下是需要添加上面
说的那段代码才行, 如果是直接用VS2005新建的项目IDE会自动在stdafx.h中添加这些代码,不需要自己加了。 而且VS2005会自动生成.mainfest文件,所有也不需要我们添加了。

以上说的是EXE文件的方法,对于DLL及ActiveX会有点不同。
---------
找到刚才的 XpStyle.mainfest导入,资源类型名为24(必须是24),ok,然后修改IDR_241为1(必须是1)。
-------------
对于DLL IDR_241IDR_241为2为2, 对于ActiveX IDR_241IDR_241为2为3

当然如果在VS2005下面编译的项目也不需要我们关心这些了。
但对于DLL和ActiveX 项目,除了上面说的要在stdafx.h的最后面加代码外还需要在
#if _MSC_VER > 1000前面加上
#define ISOLATION_AWARE_ENABLED     1
才有效果
VC6界面类编程小实例\A Drag and Drop List Control.doc ...................\MFC窗口位置管理详细分析及实例.doc ...................\Toolbar制作菜单条过程详解.doc ...................\VC++6.0定制窗口的方法.doc ...................\VC++中MFC窗口对象的清除.doc ...................\VC++任务栏提示区图标的实现.doc ...................\VC++动态加入和删除菜单的方法.doc ...................\VC++环境下浮动工具条的编程.doc ...................\VC++环境下菜单和工具栏的动态修改技术.doc ...................\VC中如何捕获和释放鼠标.doc ...................\VC控件 TreeCtrl 与 ListCtrl 演示.doc ...................\VC界面编程总结.doc ...................\VC编程中如何在界面上实现3D文字.doc ...................\VC编程实现IE风格界面.doc ...................\VC编程实现IE风格界面之叙述.doc ...................\VC设计分割视图通用创建框架.doc ...................\VC通用控件编程之CImageList控件.doc ...................\Visual C++中位图按钮的新颖设计.doc ...................\Visual C++中实现对图像数据的读取显示.doc ...................\Visual C++中的图形特技.doc ...................\Visual C++模态对话框消息处理机制的分析.doc ...................\Visual C++窗体设计技巧集.doc ...................\Visual C++窗口标题改变的几种方法.doc ...................\Windows 界面设计:拉帘按钮设计.doc ...................\XListBox-自画条目背景和文字颜色的listbox控件.doc ...................\XP风格控件界面库.doc ...................\一个功能强大的MFC界面处理扩展库:CJ60Lib.doc ...................\一个屏幕捕捉的例子.doc ...................\一段使窗口透明的代码(仅适用于2000).doc ...................\一种漂亮的自绘菜单.doc ...................\为CListBox加上智能水平滚动条.doc ...................\为列表控件添加水平滚动条.doc ...................\为对话框程序添加工具条和状态栏.doc ...................\从资源中加载皮肤, 使用免费界面库 AppFace For VC 0.2 美化您的软件.doc ...................\位图文件读写综述.doc ...................\使用CRectTracker类进行对象动态定位.doc ...................\使用CTabCtrl控件实现属性页功能.doc ...................\使用测试优先方法开发用户界面.doc ...................\关于内存DC绘图防止屏幕闪烁说明.doc ...................\创建有个性的对话框之MFC篇.doc ...................\利用VC编程在界面上实现3D文字.doc ...................\利用钩子实现菜单阴影效果.doc ...................\制作 MSN、QQ 的消息提示窗口.doc ...................\单文档与多视的实现方法.doc ...................\图像平滑滚动效果的VC实现.doc ...................\在(CListView)列表视图中添加右键菜单.doc ...................\在ATL Browser Helper对象中使用WTL TreeView.doc ...................\在SDI MDI程序的工具条上加入漂亮的标题头.doc ...................\在VC++6.0开发中实现全屏显示.doc ...................\在VC下显示JPEG、GIF格式图像的一种简便方法.doc ...................\在VC中用CMenuXP使应用程序拥有Office XP风格界面.doc ...................\在VC中透明浮动按键的实现.doc ...................\在Windows95,98中实现苹果窗口界面.doc ...................\在单文档中添加系统菜单项.doc ...................\在单文档程序中动态切换多个窗体.doc ...................\在对话框上加超链接.doc ...................\在类VC的界面实现中加入目录树.doc ...................\在视图中同步显示鼠标的位置.doc ...................\如何创建一个不规则形状的窗口.doc ...................\如何创建无模式对话框.doc ...................\如何创建有模式对话框.doc ...................\如何制作弹出式菜单.doc ...................\如何在VC中改变控件的背景色.doc ...................\如何在状态条中加入图像.doc ...................\如何模拟《WORD》的窗口形式.doc ...................\如何编写类似于Word97的工具栏.doc ...................\如何隐藏显示在任务栏中的对话框程序.doc ...................\实现带阴影弹出的窗口.doc ...................\实现真正的Windows屏幕保护程序.doc ...................\对CXPStyleButtonST的改造.doc ...................\对话框隐藏的几种方法.doc ...................\带有菜单的EDIT控件实现.doc ...................\平面、带图片的按钮.doc ...................\扩展COleDropTarget类来支持任意窗口拖放.doc ...................\拖拉机客户端任务书.doc ...................\数据库开发之窗体编程.doc ...................\文档与视图的建立和关联.doc ...................\无闪烁刷屏技术的实现.doc ...................\显示作为窗口或对话框背景的位图.doc ...................\最简单的界面增强库EasySkin.doc ...................\树视控件在多文档中的使用.doc ...................\根据文本串的长度改变窗口的大小.doc ...................\用MFC对话框做无闪烁图片重绘.doc ...................\用SDK实现分隔条.doc ...................\用VC++制作有滚动字幕效果的软件封面.doc ...................\用VC设计托盘图标程序.doc ...................\用Visual C++实现带阴影弹出窗口的技术.doc ...................\用户界面设计的技巧与技术.doc ...................\百叶窗式面板组.doc ...................\窗口类的诞生.doc ...................\类似Vc和Outlook的界面.doc ...................\编程打开特殊的系统窗口.doc ...................\自绘菜单的实现.doc ...................\自绘边框窗口.doc ...................\让对话框显示背景图.doc ...................\谈VC++中的Progress控件的使用.doc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值