vc中实现xp风格界面

转载 2006年05月26日 14:25:00
关于让自己的程序界面实现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文件: 

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <assemblyIdentity 
   name="XP style manifest"  
   processorArchitecture="x86" 
   version="1.0.0.0" 
   type="win32"/>  
  <dependency>  
   <dependentAssembly>  
   <assemblyIdentity 
   type="win32"  
   name="Microsoft.Windows.Common-Controls"  
   version="6.0.0.0"  
   processorArchitecture="x86"  
   publicKeyToken="6595b64144ccf1df"  
   language="*"  
   />  
   </dependentAssembly>  
  </dependency>  
  </assembly>  

  大家也看到了,这其实是一个XML文件,打开记事本,复制上面的内容,然后存盘,文件名任意,这里我存为XPStyle.manifest。  

  然后在VC中新建一个MFC AppWizard(exe)工程,Document/View或Dialog均可,接着把XPStyle.manifest复制到工程所在目录,再用记事本或其它文本编辑工具手动修改工程目录下的资源文件(.rc),在文件最后加上一行:  

  1 24 “XPStyle.manifest” 

  在VC中编译并连接工程生成.exe可执行文件,运行一下看看。 

  就这么简单?就这么简单。 :D  

  这里我再多解释一下,最后加上的那一行,“1”代表资源ID,必须是“1”。“24”代表资源类型,我想我们对RT_ACCELERATOR、RT_BITMAP、RT_MENU、RT_STRING等资源都非常熟悉,而“24”实际上是RT_MANIFEST。最后面引号中的东西我就不再啰嗦了。  

  好了,编译后的这个.exe文件拿到哪都可以,都是XP风格的界面,不用再依赖.manifest文件了。哦,当然了,必须在XP或2003系统下才可以。


我试了一下,方法是可行的,主要是要注意  1 24 “XPStyle.manifest”  放的地方,不然编译器会提示你找不到该文件

我是这么放的

//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED

1 24 “XPStyle.manifest”  放这里!
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE
BEGIN
    "resource.h/0"
END

2 TEXTINCLUDE DISCARDABLE
BEGIN
    "#include ""afxres.h""/r/n"
    "/0"
END

3 TEXTINCLUDE DISCARDABLE
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES/r/n"
    "#define _AFX_NO_OLE_RESOURCES/r/n"
    "#define _AFX_NO_TRACKER_RESOURCES/r/n"
    "#define _AFX_NO_PROPERTY_RESOURCES/r/n"
    "/r/n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)/r/n"
    "#ifdef _WIN32/r/n"
    "LANGUAGE 9, 1/r/n"
    "#pragma code_page(1252)/r/n"
    "#endif //_WIN32/r/n"
    "#include ""res//TISDemo.rc2""  // non-Microsoft Visual C++ edited resources/r/n"
    "#include ""afxres.rc""         // Standard components/r/n"
    "#endif/r/n"
    "/0"
END

#endif    // APSTUDIO_INVOKED

VC++6 实现界面使用XP风格

VC++6 实现界面使用XP风格看到有人需要这个东西,在英文下有很多文章,中文搜索发现不是很好,因此特意介绍下。1.实现原理  微软为WindowsXP提供了Themes服务。Themes可以让程序具...
  • greenerycn
  • greenerycn
  • 2008年10月26日 16:22
  • 8370

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

主要内容 以vs2008为例 我们新建一个MFC工程的时候,Project style默认只有一个选项,下面的Visual style and colors子选项也是不可选的,这个选项就决定了对话...
  • qinuo_2010
  • qinuo_2010
  • 2014年11月01日 15:09
  • 1325

如何使得WIN7下用VS2010做出的MFC程序具有XP风格(摆脱传统界面的效果)

VS2010建一个MFC的工程后,运行生成的对话框还有按钮之类的资源控件的风格是XP以前的传统的界面风格,效果不太令人满意。                                ...
  • xiaoxiaomao410
  • xiaoxiaomao410
  • 2014年09月05日 15:58
  • 2519

VC程序中Windows XP风格程序界面的实现

文章原创,转载请注明出处 默认情况下用MVC++98创建的MFC应用程序的界面使用5.82版本的ComCtrl32.dll中控件,使得其风格为Windows 2000系统的风格, 看上去绘制得比较...
  • menglongbor
  • menglongbor
  • 2013年01月17日 16:19
  • 3084

VC实现XP风格界面

新建一个本文文件,把以下代码复制进去name="XP style manifest"processorArchitecture="x86"version="1.0.0.0"type="win32"/>...
  • xd_yfwang
  • xd_yfwang
  • 2009年03月07日 11:35
  • 257

VC中实现界面XP风格

只需要在stdafx.h里加入如下语句:#if defined _M_IX86#pragma comment(linker,"/manifestdependency:/"type='win32' na...
  • Mi_Bo
  • Mi_Bo
  • 2011年02月12日 11:15
  • 654

VB如何生成WINDOW XP风格界面!

 虽然WindowsXP的界面非常华丽。但是令人遗憾的是,我们用VB写的程序除了菜单和窗口的外观是XP风格外,其他控件还是一如既往的是普通风格。我想,有的程序在XP下有XP的风格,VB也一定有办法实现...
  • 520vc
  • 520vc
  • 2010年01月17日 11:58
  • 337

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

方法1 无负担的manifest文件 关于让自己的程序界面实现XP风格这个问题,在网上的讨论很多,大多数的作法都是写一个.manifest文件,然后将文件名改一下,比如.exe文件为test.exe...
  • lonelyrains
  • lonelyrains
  • 2015年05月04日 19:02
  • 1380

剽窃vs2010 mfc 工程 让程序自动嵌入xp界面风格 系统风格

// x86 #pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Co...
  • whitehack
  • whitehack
  • 2010年12月29日 16:20
  • 3719

VC无负担实现XP风格界面

关于让自己的程序界面实现XP风格这个问题,在网上的讨论很多,大多数的作法都是写一个.manifest文件,然后将文件名改一下,比如.exe文件为test.exe,就将这个.manifest文件改名成t...
  • hansir007
  • hansir007
  • 2007年08月20日 17:33
  • 401
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc中实现xp风格界面
举报原因:
原因补充:

(最多只允许输入30个字)