Windows XP主题和控件外观

2008-04-09 04:02:27来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  在早期32-bit 版本的Windows中,用户控件是在ComCtl32中实现的,但是一些控件的显示功能是在User32.dll中实现的。例如在一个窗口中非客户区域(边框和菜单)的绘制就是由User32.dll来完成的。User32.dll 是操作系统的一个核心控件,它和操作系统是紧密联系在一起的。也就是说,不同版本的Windows中User32.dll 是不同。因此,应用程序在不同版本的Windows中运行的时候,由于User32.dll的不同,会导致应用程序的界面通常会有微小的不同。

  在Windows 2000 和 Windows Me中, ComCtl32 和User32.dll是处于Windows的文件系统保护下的。因此它只能在系统升级或者是安装系统程序包的时候才能被改变。在Windows 2000 和 Windows Me以前的Windows版本中,ComCtl32 和User32.dll 实际上是和许多的应用程序或者系统程序包一起发布和安装的,可以被任何一个应用程序改变。由于无法保证每个应用程序或系统程序包都使用了正确的ComCtl32 和User32.dll,因此在安装了不同的应用程序和系统程序包后,常常导致系统中的ComCtl32 或User32.dll损坏或者是版本不符,从而使系统运行错误或导致应用程序运行错误。这个问题在Windows 2000 、Windows Me和所有的以前版本中都存在。

  Windows XP 引入了全新的 Windows 组件模式,这种组件模式是基于组件并列共享(side-by-side sharing)。Windows XP容许不同版本的ComCtl32 和User32.dll 同时安装在系统中,不同的应用程序可以调用自己需要的版本,较好地解决了ComCtl32 和User32.dll对系统带来的潜在问题。

  Windows XP对ComCtl32 和User32.dll的进步不仅在并列共享上,在Windows XP中,控件的外观是要受Windows XP的显示主题影响的。为了使应用程序在Windows XP改变显示主题的时候也改变自己的外观,Microsoft 在Windows XP中引入了主题管理功能。首先,在Windows XP中Microsoft将用户Win32 控件和公用控件的外观绘制功能全部集成在ComCtl32 version 6 中。其次,在Windows XP中,ComCtl32 version 6在绘制控件的外观的时候将依据系统的显示主题来进行。通过这两方面的结合,在Windows XP中,控件的外观显示就可以依据系统的显示主题进行改变了。

  Windows XP的主题管理功能包含在uxtheme.dll中。 在Windows XP中,这个新的DLL 提供控件客户区域绘制时需要的信息,同时uxtheme.dll 还提供控件中非客户区域绘制时所需要的信息,例如一个窗口在绘制滚动条和标题条时需要的信息。这就意味着在每个程序中的每个控件都会和uxtheme.dll配合来完成控件的绘制工作。因此,在Windows XP种,由uxtheme.dll和ComCtl32一起配合工作,使应用程序可以根据Windows XP的不同的显示主题改变自己的外观。

  从上面看到,由于ComCtl32 version 6具有这些新特色,它也给应用程序带来了一些风险。ComCtl32 version 6可能使原有的一些应用程序无法运行。为了防止这样的情况的出现,在Windows XP中以共享安装(side-by-side sharing)模式同时安装了ComCtl32 version 6 和ComCtl32 version 5。它们都安装在System32 目录下。

  注意,在Windows XP中,并不是每个程序都使用ComCtl32 version 6。只有当应用程序在自己的程序清单中指明使用ComCtl32 version 6的时候,Windows XP才会让应用程序使用ComCtl32 version 6。假如一个应用程序没有提供程序清单,那么Windows XP就会为这个程序调用ComCtl32 version 5,这样可以保证原有程序的正确运行。

  注意: ComCtl32 version 6 仅仅安装在Windows XP中,以前版本的Windows中并没有。在以前版本的Windows中,只可以使用ComCtl32 version 5。

  为了使应用程序使用Windows XP中的全新用户界面并支持随着显示主题的改变而改变外观,我们必须在应用程序中使用ComCtl32 version 6,同时使用程序清单来指定调用ComCtl32 version 6。如果在你的应用程序中有自己绘制的控件,记着使用uxtheme.dll 来绘制它们,而不要自己直接去绘制它们。这样才能保证你自己绘制的控件和Windows XP完全融合在一起。

  下面是一个具有主题感知能力的按钮代码,这段代码显示了如何利用ComCtl32 version 6来实现主题感知控件。

rtButton.top = 100;
rtButton.left = 10;
rtButton.bottom = 130;
rtButton.right = 200;
hTheme = OpenThemeData(hWnd, L"Button");
DrawThemeBackground(hTheme, hdc, BP_PUSHBUTTON, PBS_NORMAL, &rtButton, NULL);
DrawThemeText(hTheme, hdc, BP_PUSHBUTTON, PBS_NORMAL, wzTMB, wcslen(wzTMB),
DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS | DT_SINGLELINE, 0, &rtButton);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Windows XP快速用户切换

下一篇:简单对象访问协议(SOAP)初级指南