0xAA55 发表于 2014-4-16 19:47:04

【界面】如何美化自己的界面为“XP样式”

并不是说把界面搞得和WinXP完全一样,而是一些很细节的外观美化。我这里举个例子:
美化前:

美化后:

大家会注意到美化后,各种控件都做到了“与时俱进”(XP上是XP的控件的效果,Win7上是Win7的控件的效果,然后Win8是Win8的控件的效果)
这个优化的过程是怎么做到的呢?我来说两点。
1、调用InitCommonControls()
2、你的程序有个Manifest

调用InitCommonControls不难,C语言这样:#include<commctrl.h>链接的时候记得把comctl32.lib链接进去。
然后VB这样:Declare Sub InitCommonControls Lib "comctl32.dll" ()
这样之后你就可以调用它了。InitCommonControls();一句搞定。有人可能会问,“这个什么时候调用啊?”那当然是越早越好。

然后就是Manifest。其实是一个文本文件,和你的EXE放到一起,然后文件名也必须是“EXE名.MANIFEST”,就像这样:


这样再加上你的EXE调用了InitCommonControls(),你就能优化界面了。
接下来是关键:MANIFEST文件的内容是什么?请看如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
    <dependentAssembly>
      <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
      />
    </dependentAssembly>
</dependency>
</assembly>你把这些XML代码复制下来放到记事本,然后保存为MANIFEST文件就行了。
不过这样就总有个文件跟着自己的EXE,很是不爽。这个时候就是我教大家怎么摆脱这个文件实现XP样式的时候了!
首先大家应该都知道编程是可以给自己的程序添加“资源”这种东西的吧?我这里说的“资源”就是后缀为“.RC”的这个资源。
给自己的程序添加一个类型为24,ID为1的资源,内容就是上面那个MANIFEST的内容。我这里用VC6演示。
首先添加一个自定义资源,类型为24

然后在资源这里点右键属性把ID设置为1

最后把上面那段XML代码直接复制进去作为内容,保存为MANIFEST.TXT

哟。这样就可以啦。
这个时候直接运行就能看到XP样式的程序。是不是屌爆了!

然而其实有个非常简单的办法……
1、在你的程序里加入如下的代码:#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放到.c的开头也行,结尾也行,或者专门新建一个.c也行。
2、在你的WinMain或者int main或者WM_CREATE等地方(创建控件前)调用InitCommonControls();即可。

用这种方法就可以了,没必要用前面那种方法……

FireCloud 发表于 2014-4-17 00:19:56

不用越早越好,
函数InitCommonControls是个空函数,不做任何事情。
但如果你调用了该函数,则链接器会将你的程序链接到comctl32.lib,然后在程序启动时,会加载comctl32.dll。
真正初始化的工作是在该库的入口点处做的,在这里会注册通用控件窗口类。
然后应用程序就可以创建控件窗口,就象创建其它的子窗口控件一样。

0xAA55 发表于 2014-4-17 16:41:25

FireCloud 发表于 2014-4-16 16:19
不用越早越好,
函数InitCommonControls是个空函数,不做任何事情。
但如果你调用了该函数,则链接器会将你 ...

C、ASM等是这样。
VB6只在被调用的时候才会加载这个Dll,而且在XP情况下需要你的启动窗体包含至少一个6.0版本的公共控件,且不可以是MDIForm

0x0208 发表于 2014-4-18 11:02:58

俺用VB,都是,
子类化重绘按钮。
然后开着经典模式的XP系统,
嗯,很给力。

德小SHUO 发表于 2020-7-23 14:28:21

非 VC 编译器只能自己编译添加资源文件吗...
后两种方法貌似没用

系统消息 发表于 2020-7-23 22:24:05

FireCloud 发表于 2014-4-17 00:19
不用越早越好,
函数InitCommonControls是个空函数,不做任何事情。
但如果你调用了该函数,则链接器会将你 ...

XP才需要调用,Vista之后user32会自动依赖comctl32.dll,你完全不调用任何初始化函数。

系统消息 发表于 2020-7-23 22:44:26

德小SHUO 发表于 2020-7-23 14:28
非 VC 编译器只能自己编译添加资源文件吗...
后两种方法貌似没用

你是VB吗?还是什么?

德小SHUO 发表于 2020-7-24 01:57:26

系统消息 发表于 2020-7-23 22:44
你是VB吗?还是什么?

C语言MinGW gcc编译器

系统消息 发表于 2020-7-26 20:35:51

德小SHUO 发表于 2020-7-24 01:57
C语言MinGW gcc编译器

可以先生成exe文件,再用巨硬的命令行清单工具(mt.exe)来把清单文件(.manifest)嵌入exe资源,或者你手动调用UpdateResource这个API修改exe资源也可以。
页: [1]
查看完整版本: 【界面】如何美化自己的界面为“XP样式”