首先是设计窗口类,填写WNDCLASS 结构体内的各种选项吧;
接着是注册窗口类,RegisterClass(&wndcls);
再来就是创建窗口:
hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
这里特别讲下//program instance handle这个参数指明了你创建的窗口从属于哪一个实例的。
这里还要注意的地方就是CreateWindow函数会产生WM_CREATE消息并且这个消息并不是进队列消息,WM_CREATE消息会跳过消息队列,直接交由过程函数处理,这就是为什么Message loop在CreateWindow函数后面的一个理由吧。
第一个收到的message就是WM_CREATE,在调用CreateWindow时就发送了WM_CREATE,Windows调用适当的过程函数处理,用CreateWindow第一个参数就作为WinProc的第一个参数,WM_CREATE做WinProc的第二个参数,由WinProc处理这个消息,处理完返回Windows,再返回CreateWindow
紧接着是ShowWindow(hwnd,iCmdShow);
最后UpdateWindow(hwnd);
接着是最重要的消息循环,每一个实例系统都分配一个消息队列,这个消息队列是这个实例所有窗口公用的:. This message queue stores messages to all the windows a program might create.
GetMessage(&msg,NULL,0,0)是从消息队列里取出消息并放到msg里面,只有取到WM_QUIT消息才会返回0.
GetMessage从消息队列中获取消息填充msg,再把msg发回Windows,Windows要么进行
Translate要么把msg派送到适当的过程函数中,调用过程函数处理完成之后返回给Windows
这时程序仍然处于DispatchMessage()函数中,当这个函数完了就继续获取下一个信息。
按关闭按钮会发送WM_SYSCOMMAND(DefWindowProc处理,返回WM_CLOSE),WM_CLOSE又由DefWindowProc处理,调用
DestroyWindow()函数来销毁窗口,这个函数会返回WM_DESTROY,由WinProc处理,PostQuitMessage()来结束消息循环。