在Win32 SDK程序中使用主题风格的通用控件

  • 格式:docx
  • 大小:144.37 KB
  • 文档页数:5

在Win32 SDK程序中使用主题风格的通用控件
参考文章:http://blog.csdn.net/fxthj2008/article/details/6272455

在windows Xp 及以上的操作系统中,类似于按钮之类的控件的风格可以随着主题的变化而
变化,举个例子来说在xp系统中,windows 经典主题下,运行对话框下图所示:

在royale主题下的运行对话框如下图所示:
很显然royale主题下的按钮,组合框等控件更加的漂亮,但是当我们用win 32api 直接编
写的应用程序运行时却显示为windows经典主题下的风格和外观,示例代码如下:

1. #include
2. #include
3. #include "resource.h"
4.
5. #pragma comment(lib,"comctl32.lib")
6.
7. void CenterWindow(HWND hwnd)
8. {
9. int cx=GetSystemMetrics(SM_CXSCREEN);
10. int cy=GetSystemMetrics(SM_CYSCREEN);
11. int w,h,i,j;
12.
13. RECT rect;
14. GetWindowRect(hwnd,&rect);
15. w=rect.right-rect.left;
16. h=rect.bottom-rect.top;
17.
18. i=(cx-w)/2;
19. j=(cy-h)/2;
20.
21. MoveWindow(hwnd,i,j,w,h,TRUE);
22. }
23.
24. BOOL CALLBACK ReminderDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM
lParam);
25.
26. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
27. LPSTR lpCmdLine,int nShowCmd )
28. {
29. INITCOMMONCONTROLSEX ic;
30. ic.dwSize=sizeof(ic);
31. ic.dwICC=ICC_WIN95_CLASSES;
32. InitCommonControlsEx(&ic);
33. DialogBox(hInstance,MAKEINTRESOURCE(IDD_DLG_REMINDER),GetDesktopWindow()
,ReminderDlgProc);
34.
35. return 0;
36. }
37.
38. BOOL CALLBACK ReminderDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM
lParam)
39.
40. {
41.
42. switch (message)
43. {
44. case WM_INITDIALOG:
45. //尝试将窗口放置在屏幕中央
46. CenterWindow(hDlg);
47. return TRUE ;
48. case WM_COMMAND :
49. switch (LOWORD (wParam))
50. {
51. case IDC_CLOSE_DLG:
52. case IDOK :
53. case IDCANCEL :
54. EndDialog (hDlg, 0) ;
55. return TRUE ;
56. }
57. break ;
58. }
59. return FALSE ;
60. }

代码中IDD_DLG_REMINDER是一个对话框模板。代码运行结果:

之所以会出现这样的情况,是因为在windows 2000以前的系统默认没有主题功能,组
合框等的公用控件所依赖的公用控件库Comctl32.dll并没有实现主题的功能,在xp下系统
已经有了主题的功能,当然也提供了实现了主题功能的Comctl32.dll,也就是版本6的
Comctl32.dll。但是以前的应用程序链接到这个dll可能运行会不正常,为了兼容以前的应用
程序,xp系统也提供了版本5的Comctl32.dll。系统通过一个叫做manifest的东西来确定应
该加载哪一个dll,在win32 API编写的应用程序中并没有添加manifest。所以系统默认加载
版本5的Comctl32.dll。要在win32 API 编写的应用程序中使用版本6的Comctl32.dll,需要
添加manifest。
在win32 API 编写的应用程序中添加manifest的方法为首先用记事本新建一个文本文档其
内容为:
[xhtml] view plaincopy
1.
2.
3. 4. version="1.0.0.0"
5. processorArchitecture="X86"
6. name="SabioNet.AshWin.ashw32"
7. type="win32"
8. />
9. AshWin
10.
11.
12.
13. 14. type="win32"
15. name="Microsoft.Windows.Common-Controls"
16. version="6.0.0.0"
17. processorArchitecture="X86"
18. publicKeyToken="6595b64144ccf1df"
19. language="*"
20. />
21.

22.

23.

以ANSI为编码将这个文档保存为*manifest.的文件,如下图所示:

在用win32sdk编写的应用程序中添加资源,选择导入,打开刚才编写的文件,在弹出的
资源类型对话框中将资源类型设定为”24”,确定后将资源ID改为1,如下面一系列图片所示:

编译运行程序就可以看到具有主题风格的按钮出现了。


注意:用Win32 API写的程序里面,必须在建立窗口之前正确调用了InitCommonControls或
InitCommonControlsEx函数
本方法编写的程序仅能在win xp以上系统中拥有主题风格的通用控件。

提示:在VS2005及以上版本中上市所有添加manifest的过程可以通过在代码中加入下面的
文字来代替。
//以下这段代码根据具体的平台需要作修改,如果这些值不对,VS2005编译时会出现信息
//对比错误,对比改正就可以了。
#pragma comment(linker, "\"/manifestdependency:type='Win32'
name='Test.Research.SampleAssembly' version='6.0.0.0' processorArchitecture='X86'
publicKeyToken='0000000000000000' language='*'\"")
本文档示例方法在VC6,VS2005中测试通过