窗口和消息的概念几乎是Windows程序设计最基础而且重要的两个概念。
桌面上最明显的窗口就是应用程序窗口。另一类的窗口是对话框。装饰对话框表面的还有格式各样的按钮,列表框或者文本框,其中每个小的可视对象都是一个窗口。更确切的说,这些都是“子窗口”或“控件窗口”或“子窗口控件”。子窗口建立时选择一个父窗口附着在上面。这样一层一层的进行分类。
更进一步,其实我们的Windows桌面页是一个窗口。窗口可以有它的子窗口,或者兄弟窗口。(Windows窗口的存储形式其实是用二叉树实现,桌面的就是根节点,节点的左子树是他的子窗口。桌面的右子树定义了它的兄弟窗口。)
作为对象,窗口会在屏幕上看到这些窗口,并通过鼠标和键盘直接与它们进行交互,而程序员的观点和用户观点及其相似。窗口以“消息”的形式接收窗口的输入,窗口也用消息与其它窗口通信。
消息就是窗口之间通信的方式。Windows最大的特点就是它可以给窗口发送消息。它也可以调用程序里的函数(回调函数)。这就是Windows编程和Dos编程最大的区别。Windows帮助程序员实现了很多的功能。
Windows就像一个认真负责的秘书提醒你的程序完成自己的工作,当程序建立的时候,它给程序发送WM_CREATE消息。就好像在通知程序,窗口正在创建,需要做什么赶快实现。当窗口大小被改变的时候它发送给程序WM_SIZE,通知程序窗口的大小已经被改变了,需要做什么?当你需要做什么时,只需要在这时处理,然后返回。如果不需要做什么的时候只需要返回return DefWindowProc(hWnd, iMsg, wParam, lParam);来调用缺省的函数就可。
这里就是Windows编程的需要做的一个重要的思维转变,以往的DOS方式下应用程序作为主体调用系统,而现在是由系统作为主体调用应用程序。其实它比和以往的DOS下应用程序编程更为简单。真正生成的程序和DOS区别也不大:
以往的DOS程序: 现在的Windows程序
void main()
{………
//程序建立初始化: //程序建立初始化相应WM_CREATE
………… ……….
//程序结束清除: //程序结束 相应WM_DESTROY消息
…………. //
}
可以看出现在的Windows编程和传统的DOS最大的区别就是一种思路上的转变,从我控制所有的事情,变为Windows控制主要的流程,我只需要在需要的地方加上我的数据。这也是微软设计Windows编程的一种理念。
消息队列与进队消息和不进队消息:
每个窗口过程都有自己的消息队列,Windows把消息放入消息队列,而程序取出消息并执行。消息队列能对消息进行一定的缓冲和整理。
Windows给窗口发送消息,Windows程序有时依次等待消息,有时直接从程序外面接收消息。它们分别被称为“进队的消息”和“不进队的消息”,大部分情况下不进队的消息是通过调用特定的Windows函数产生的。