找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3684|回复: 8

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

[复制链接]

1112

主题

1652

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24251 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 2014-4-16 19:47:04 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
并不是说把界面搞得和WinXP完全一样,而是一些很细节的外观美化。我这里举个例子:
美化前:
20140416191904.png
美化后:
20140416192156.png
大家会注意到美化后,各种控件都做到了“与时俱进”(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”,就像这样:
20140416193519.png

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


然而其实有个非常简单的办法……
1、在你的程序里加入如下的代码:
  1. #if defined _M_IX86
  2. #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'"")
  3. #elif defined _M_IA64
  4. #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'"")
  5. #elif defined _M_X64
  6. #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'"")
  7. #else
  8. #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")
  9. #endif
复制代码
放到.c的开头也行,结尾也行,或者专门新建一个.c也行。
2、在你的WinMain或者int main或者WM_CREATE等地方(创建控件前)调用InitCommonControls();即可。

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

使用道具 举报

1

主题

5

回帖

60

积分

用户组: 小·技术宅

UID
23
精华
1
威望
2 点
宅币
45 个
贡献
0 次
宅之契约
0 份
在线时间
3 小时
注册时间
2014-2-1
发表于 2014-4-17 00:19:56 | 显示全部楼层
不用越早越好,
函数InitCommonControls是个空函数,不做任何事情。
但如果你调用了该函数,则链接器会将你的程序链接到comctl32.lib,然后在程序启动时,会加载comctl32.dll。
真正初始化的工作是在该库的入口点处做的,在这里会注册通用控件窗口类。
然后应用程序就可以创建控件窗口,就象创建其它的子窗口控件一样。
回复 赞! 靠!

使用道具 举报

1112

主题

1652

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24251 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
 楼主| 发表于 2014-4-17 16:41:25 | 显示全部楼层
FireCloud 发表于 2014-4-16 16:19
不用越早越好,
函数InitCommonControls是个空函数,不做任何事情。
但如果你调用了该函数,则链接器会将你 ...


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

使用道具 举报

4

主题

41

回帖

160

积分

用户组: 小·技术宅

UID
208
精华
0
威望
1 点
宅币
113 个
贡献
0 次
宅之契约
0 份
在线时间
10 小时
注册时间
2014-4-16
发表于 2014-4-18 11:02:58 | 显示全部楼层
俺用VB,都是,
子类化重绘按钮。
然后开着经典模式的XP系统,
嗯,很给力。
回复 赞! 靠!

使用道具 举报

4

主题

28

回帖

289

积分

用户组: 中·技术宅

UID
5449
精华
0
威望
6 点
宅币
245 个
贡献
0 次
宅之契约
0 份
在线时间
42 小时
注册时间
2019-12-13
发表于 2020-7-23 14:28:21 | 显示全部楼层
非 VC 编译器只能自己编译添加资源文件吗...
后两种方法貌似没用
回复 赞! 靠!

使用道具 举报

9

主题

178

回帖

1万

积分

用户组: 真·技术宅

UID
4293
精华
6
威望
441 点
宅币
8680 个
贡献
850 次
宅之契约
0 份
在线时间
339 小时
注册时间
2018-9-19
发表于 2020-7-23 22:24:05 | 显示全部楼层
FireCloud 发表于 2014-4-17 00:19
不用越早越好,
函数InitCommonControls是个空函数,不做任何事情。
但如果你调用了该函数,则链接器会将你 ...

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

使用道具 举报

9

主题

178

回帖

1万

积分

用户组: 真·技术宅

UID
4293
精华
6
威望
441 点
宅币
8680 个
贡献
850 次
宅之契约
0 份
在线时间
339 小时
注册时间
2018-9-19
发表于 2020-7-23 22:44:26 | 显示全部楼层
德小SHUO 发表于 2020-7-23 14:28
非 VC 编译器只能自己编译添加资源文件吗...
后两种方法貌似没用

你是VB吗?还是什么?
回复 赞! 靠!

使用道具 举报

4

主题

28

回帖

289

积分

用户组: 中·技术宅

UID
5449
精华
0
威望
6 点
宅币
245 个
贡献
0 次
宅之契约
0 份
在线时间
42 小时
注册时间
2019-12-13
发表于 2020-7-24 01:57:26 | 显示全部楼层
系统消息 发表于 2020-7-23 22:44
你是VB吗?还是什么?


C语言MinGW gcc编译器
回复 赞! 靠!

使用道具 举报

9

主题

178

回帖

1万

积分

用户组: 真·技术宅

UID
4293
精华
6
威望
441 点
宅币
8680 个
贡献
850 次
宅之契约
0 份
在线时间
339 小时
注册时间
2018-9-19
发表于 2020-7-26 20:35:51 | 显示全部楼层
德小SHUO 发表于 2020-7-24 01:57
C语言MinGW gcc编译器

可以先生成exe文件,再用巨硬的命令行清单工具(mt.exe)来把清单文件(.manifest)嵌入exe资源,或者你手动调用UpdateResource这个API修改exe资源也可以。
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-26 03:24 , Processed in 0.053602 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表