Windows程序的本质:基于消息,事件驱动(Message Based,Event Driven)
一般情况下,一个Win32程序应包含以下几个步骤:
(1)注册窗口类
(2)创建窗口
(3)显示窗口
(4)消息循环
(5)窗口过程
一、注册窗口类
1.窗口类:WNDCLASS
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc; //窗口过程函数
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName; //窗口类名称
} WNDCLASS;
注:
(1)WNDCLASS共10个字段,其中第2个和最后一个字段最重要
(2)基于同一窗口类可创建多个窗口
2.注册窗口类:
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass // address of structure with class data
);
例:RegisterClass(&wndclass);
二、创建窗口:CreateWindow
HWND CreateWindow(
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu or child-window identifier
HANDLE hInstance, // handle to application instance
LPVOID lpParam // pointer to window-creation data
);
注:
1.CreateWindow共11个参数
2.窗口类和创建窗口的区别
窗口类:定义了窗口的一般特征
创建窗口:指定窗口更详细的信息,如窗口标题,大小。
3.CreateWindow只创建窗口,但并不显示窗口:CreateWindow调用之后,Windows已经分配了内存,用于保存在CreateWindow中指定的窗口信息。
三、显示窗口
1.ShowWindow:
2.UpdateWindow:向窗口过程函数发送一WM_PAINT消息。
四、消息循环
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg) ;
}
typedef struct tagMSG { // msg
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
注:
1.GetMessage:只要从消息队列中取出消息的message字段不为WM_QUIT(其值为0x0012),GetMessage就传回一个非零值。WM_QUIT消息将导致GetMessage传回0。
2.TranslateMessage (&msg) ;
将msg结构传给Windows,进行一些键盘消息转换。
3.DispatchMessage (&msg) ;
将msg结构回传给Windows。然后,Windows将该消息发送给适当的窗口过程函数,让它进行处理。即Windows将调用窗口窗口过程函数
五、窗口过程
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
注:
1.CALLBACK:Windows程序员设计定义函数,但由Windows负责调用
2.基于同一个窗口类创建的多个窗口,共同使用一个窗口过程函数,即窗口过程函数处理基于同一个窗口类创建的多个窗口的消息.
3.Windows给程序发送消息:Windows通过调用窗口过程函数来给窗口发送消息,窗口过程函数对此消息进行处理,然后将控制返回给Windows.
4.窗口过程函数在处理消息时,必须传回0。窗口过程函数不予处理的所有消息应该被传给Windows默认窗口过程函数:DefWindowProc。从DefWindowProc传回的值必须由窗口过程函数WndProc传回.