发信人: wenbobo(灌了拂衣去)
整理人: wenbobo(2003-09-04 16:07:11), 站内信件
|
现在就把你的程序界面升级到XP
作者:wenbobo([email protected])
用过XP的人都知道,在XP下,几乎所有控件的外观都发生了变化。
自Windows 95以来,Windows的外观风格一直未发生显著改变。轮廓分明的灰色三维对话框控件已成为 Windows 的同义词。随着 Windows XP 的发布,我们将看到一个全新的外观风格。Windows XP 主题把控件、窗口边框、菜单等几乎所有可以改变的地方都修改了。换而言之,我们几乎已经可以把那个耗资源而又不稳定的winblinds丢掉了(如果某个Hacker写出themes的制作工具的话)。
然而,开发人员很快就会发现问题:我们自己写的程序,除了窗口的标题栏和边框等非客户区是XP风格的外,其余的界面还是旧的95风格,如按钮还是以前那种灰色的方块。
这显示出,我们的程序还是在用老版本的控件。究其原因,是XP的“并列组件共享”新特性造成的。此特性使得不同版本的同一共享库安全的被不同的程序使用。Windows XP同时提供ComCtl32的版本5和6的DLL,它们以并列方式预安装在系统里。只有事先声明了“能够使用这个新DLL”的程序才能使用它,如果不提供声明,系统就提供旧的ComCtl32版本。
新的声明很奇特,下面我们逐步讲解。
首先,准备一个“旧”界面的程序,这个程序最好不要是用了“自画”风格的(“自画”风格和XP themes有冲突,原因这里就不说了)。假设这个程序名为“myapp.exe”。
现在,在myapp.exe所在文件夹创建一个文本文件,文本内容为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="mycorp.myproduct.myapp"
type="win32"/>
<description>this is my application</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
这个xml文件格式不能乱写,你可以修改的只有assemblyIdentity项的name和description项。把此文件重命名为“myapp.exe.manifest”。
为了使新版的控件能够正确的初始化,需要在显示窗口之前执行一次InitCommonControls。
现在可以测试一下效果了。运行myapp.exe,你将发现,程序此时呈现出和XP一样酷的界面。用这种方法,你可以把绝大多数“旧”程序的外观改成XP风格的。
你也许会有更进一步的要求,毕竟,上面的方式有点拖泥带水的感觉。事实上,XP自身的很多程序是没有使用外部.manifest文件的。观察system32\calc.exe的资源,发现有一个类型为24的文本资源就是.manifest文件格式的,原来机关在这里。
如果拥有myapp.exe的源代码,我们就可以改造出一个不需要外部.manifest文件的“XP风格”的myapp.exe程序了。
为myapp添加一个资源文件,就叫做newstyle.rc吧,加入以下语句:
1 24 "myapp.exe.manifest"
注意,这个myapp.exe.manifest就是前面提到的.manifest文件,把它放在源代码所在文件夹。然后重新编译。
现在,再次运行myapp.exe。你的myapp.exe已经可以不使用myapp.exe.manifest而呈现出xp的新风格了。
----
太阳当头照,花儿对我笑,小鸟说早早早,你为什么背个炸药包?
我去炸学校,谁也不知道,一拉线儿,我就跑,轰隆一声学校不见了。
|
|