【界面】如何美化自己的界面为“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();即可。
用这种方法就可以了,没必要用前面那种方法…… 不用越早越好,
函数InitCommonControls是个空函数,不做任何事情。
但如果你调用了该函数,则链接器会将你的程序链接到comctl32.lib,然后在程序启动时,会加载comctl32.dll。
真正初始化的工作是在该库的入口点处做的,在这里会注册通用控件窗口类。
然后应用程序就可以创建控件窗口,就象创建其它的子窗口控件一样。 FireCloud 发表于 2014-4-16 16:19
不用越早越好,
函数InitCommonControls是个空函数,不做任何事情。
但如果你调用了该函数,则链接器会将你 ...
C、ASM等是这样。
VB6只在被调用的时候才会加载这个Dll,而且在XP情况下需要你的启动窗体包含至少一个6.0版本的公共控件,且不可以是MDIForm
俺用VB,都是,
子类化重绘按钮。
然后开着经典模式的XP系统,
嗯,很给力。 非 VC 编译器只能自己编译添加资源文件吗...
后两种方法貌似没用 FireCloud 发表于 2014-4-17 00:19
不用越早越好,
函数InitCommonControls是个空函数,不做任何事情。
但如果你调用了该函数,则链接器会将你 ...
XP才需要调用,Vista之后user32会自动依赖comctl32.dll,你完全不调用任何初始化函数。 德小SHUO 发表于 2020-7-23 14:28
非 VC 编译器只能自己编译添加资源文件吗...
后两种方法貌似没用
你是VB吗?还是什么? 系统消息 发表于 2020-7-23 22:44
你是VB吗?还是什么?
C语言MinGW gcc编译器 德小SHUO 发表于 2020-7-24 01:57
C语言MinGW gcc编译器
可以先生成exe文件,再用巨硬的命令行清单工具(mt.exe)来把清单文件(.manifest)嵌入exe资源,或者你手动调用UpdateResource这个API修改exe资源也可以。
页:
[1]