api(一) 创建窗口 (转)
所有的Windows SDK编程都有一个类似的框架,本文就说说这个框架,Windows程序设计的框架分为“三部曲”:
一、注册窗口类
注册窗口类的API函数是RegisterClass或者RegisterClassEx,这两个函数参数区别不大,具体看MSDN,这里以RegisterClass为例。函数原型如下:
参数WNDCLASS定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
{
;
;
;
;
;
;
;
;
;
;
;
|
结构成员说明如下:
style:指示类窗口类的风格,比如指定水平、垂直重画;是否显示关闭窗口等。
lpfnWndProc:窗口过程函数指针,这个是最重要的参数,该参数指定消息执行的处理函数入口。
cbClsExtra:类扩展数据大小,一般不用。
cbWndExtra:窗口扩展数据大小,一般不用。
hInstance:应用程序实例,这个参数会从WinMain函数传过来。
hIcon:应用程序的图标句柄。
hCursor:应用程序的光标句柄。
hbrBackground:窗口的背景画刷。Windows预定义了一些纯色画刷,如COLOR_GRAYTEXT、COLOR_BACKGROUND、COLOR_ACTIVECAPTION等等。
lpszMenuName:菜单名,该名以资源的方式存在。
lpszClassName:窗口类的名字,这个必须指定且不能重复,否则会失败,除非你需要重复的,否则尽量避免。
二、创建主窗口并显示
1
2
3
4
5
6
7
8
9
10
11
12
|
,
,
,
,
,
,
,
,
,
,
lpParam
;
|
参数如下:
lpClassName:类名,就是WNDCLASS结构中的 lpszClassName。
lpWindowName:本窗口的名字,一个字符串。
dwStyle:窗口风格,比如是否有边框、标题框、子窗口、水平垂直滚动条、弹出、重叠性等,具体看MSDN,很多特殊效果都是用这个风格指定的,比如类似迅雷的悬浮窗等。
x,y, nWidth, nHeight:指定窗口相对于父窗口的位置和宽高。
hWndParent:指定父窗口句柄,如果该窗口没有父窗口,则为NULL,比如应用程序主窗口。
hMenu:菜单句柄。
hInstance:应用程序实例句柄,跟WNDCLASS中的hInstance一样。
lpParam:指向一个CREATESTRUCT结构的参数。
显示并刷新窗口的API函数如下,参数都有对应的窗口句柄:
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
三、进入消息循环
这个过程基本是一个固定的格式:
1
2
3
4
5
|
)
{
;
;
}
|
该过程从系统消息队列里面获取一个消息,然后翻译虚拟按键成字符消息,并派送到窗口消息队列中,等待消息处理函数处理。如果获取到的消息为WM_QUIT,则返回0,于是就退出循环。
通过上面的三部曲,我们就创建了windows程序设计的框架,几乎任何的windows程序都可以在这个框架基础上衍生出来。下面我们给出完整的框架代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#include <windows.h>
;
;
)
{
;
;
;
;
;
;
;
;
#ifdef MY_ICON_USED
;
#else
;
#endif
;
;
;
;
)
{
;
;
}
// window class name
// window caption
// window style
// initial x position
// initial y position
// initial x size
// initial y size
// parent window handle
// window menu handle
// program instance handle
// creation parameters
;
;
)
{
;
;
}
;
}
)
{
;
;
)
{
:
// create sub window
;
:
;
// paint image
;
;
:
;
;
:
;
}
;
}
|
在消息处理函数中,根据消息类型执行不同的处理,比如WM_CREATE可以处理一些创建的工作;WM_PAINT可以处理画图,显示文本;WM_DESTROY处理在窗口被销毁时的事件;当然还有很多其他的消息事件,根据情况我们做出相应的处理。
该框架程序运行起来就是一个空空的窗口,没有任何其他内容。虽然整个框架简单,但是对于windows程序设计来说非常重要。如果你想学习windows编程,就需要把每一个部分都真正理解,这样就算基本入门windows编程了,剩下的就是如何根据需求丰富这个框架使之成为一个“有用”的程序。
下一篇我们将讲解如何在windows SDK创建各种常用的控件,请继续关注。
转载请注明原文出处:http://www.coderonline.net/?p=565