在WinForm二三事(一)里,我们谈了WinForm上的事件(比如点击啊,双击啊)是借助消息循环,消息分发的机制实现的。但那篇里只是一笔带过。后来有人问我这中间的具体关系是什么呢?那今天我们就来详细谈谈从Win32的Message到WinForm上的Event。
Win32中的Hello world
要具体了解这个问题,我们先来看看在Win32的时候,使用原生的API(或者叫Native API)如何做个简单的Hello World的小窗体:
#include <windows.h>
2:
//这就是就受消息,然后处理的地方了
4: LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
5: {
switch(msg)
7: {
return 0;
return DefWindowProc(hwnd,msg,wparam,lparam);
10: }
11: }
12:
int cmdShow)
14: {
//一个窗体类,用来设置窗体的各种属性,比如大小啊、背景颜色啊等等
16: WNDCLASSEX windowClass;
17: MSG msg;
18: HWND window;
sizeof(WNDCLASSEX));
sizeof(WNDCLASSEX);
21: windowClass.hInstance = instance;
;
//注意这里,当消息分发到这个窗体上来的时候,就是由WndProc这个函数进行处理
24: windowClass.lpfnWndProc = WndProc;
25: windowClass.hbrBackground = (HBRUSH)COLOR_WINDOW+1;
26:
if(!RegisterClassEx(&windowClass))
28: {
,MB_OK|MB_ICONERROR);
return 1;
31: }
,WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,
33: CW_USEDEFAULT, CW_USEDEFAULT, 200, 150, NULL, NULL, instance, NULL);
34: ShowWindow(window,cmbShow);
35:
//消息循环,从消息队列里获取消息,然后分发消息
//实际上GetMessage方法会返回-1(意思是出错了),所以下面这样的写法并不总是正确的
while(GetMessage(&msg,NULL,0,0))
39: {
40: TranslateMessage(&msg);
41: DispatchMessage(&msg);
42: }
43:
return 0;
45: }