要学习 Windows 编程,首先就要了解 Windows 是如何工作的。所有编程的骨架都是响应和发送消息。
l 什么是消息?
消息 (message) 就是一个指定事件的 32 比特数。例如,若移动鼠标,就会向活动窗口上发送一条 WM_MOUSEMOVE 消息。若按下某个键,就会向活动窗口上发送一条 WM_KEYDOWN 消息。若改变窗口的大小,则会往活动窗口上发送一条 WM_SIZE 消息,等等。
l 消息都到哪里去了?
这些消息都到哪里去了呢?它们将排队等候,最终将有窗口把它们从队列中取出,并做出相应的反应。例如,当窗口获取 WM_MOVE 消息后,它更改窗口的坐标,并在屏幕上重绘窗口。
l 句柄是什么?
Windows 具有很强的面向对象特性。 Windows 对象有很多,譬如桌面、读取所使用的程序等等。在非面向对象语言中,程序员如何区分这些东西呢?使用句柄。
句柄是引用不同 Windows 对象的方式。可以使用 Windows 的句柄、文件的句柄、分配内存的句柄、图像的句柄等等。
可以将这些句柄看作指针。必须用某种方式创建这些句柄。当不再使用它们时,应当销毁它们。如果不销毁它们,最终将导致资源泄漏 (resource leak) 。资源泄漏将导致系统崩溃。所以,务必确保在适当的时候销毁不再使用的句柄。
l 消息与句柄的关系?
现在将消息和句柄联系起来。假如有一个窗口,且拥有该窗口的一个句柄 ( 称做一个 HWND) 。命名句柄为 your_HWND 。因为其他窗口刚刚从该窗口上移走,操作系统希望重绘窗口。 Windows 传递如下所示消息:
PostMessage(your_HWND, WM_PAINT, 0, 0);
这个函数通过句柄 your_HWND 给窗口发送了一条绘制消息。最后两个参数用作消息的额外信息,
应用程序中有一个函数用一个庞大的 case 语句来处理所有消息。例如:
void HandleTheMessage(long Message)
{
switch (Message)
{
case WM_PAINT:
DrawWindow();
break;
case WM_KEYDOWN:
break;
// etc.
}
}
² 总结: 以上就是 Windows 的大致工作过程。了解这些原理后,就可以开始学习 MFC 了。
下面是 Windows 窗口程序的基本框架。
参考 : CodeGuru Visual C++ 编程精粹 wcdj 2010-1-17