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 plaincopy
  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),在文件最后加上一行: 
  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”  放的地方,不然编译器会提示你找不到该文件
我是这么放的
  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的最后面加上下面的几行代码即可:
  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
才有效果
展开阅读全文

没有更多推荐了,返回首页