阅读一下mimigui编程指南,有些函数又重新理解了下。同时也更好的了解Autoconf 和Automake。其中还介绍了MiniGUI-Process模式。
注意细节:
CreateInfo.hHosting:该域表示的是将要建立的主窗口使用哪个主窗口的消息队列。使用其它主窗口消息队列的主窗口,我们称为“被托管”的主窗口。
应用程序一般在主窗口过程中收到MSG_CLOSE消息时调用DestroyMainWindow这个函数销毁主窗口。
DestroyMainWindow销毁一个主窗口,但不会销毁主窗口所使用的消息队列以及窗口对象本身。因此,应用程序要在线程或进程的最后使用MainWindowCleanup最终清除主窗口所使用的消息队列以及窗口对象本身。(这句话可能有问题).
输入法窗口的方式可以借鉴。
非排队消息不通过消息队列而直接发送到目标窗口的窗口过程。系统一般铜鼓发送非排队消息通知窗口完成一些需要立即处理的事件,比如MSG_ERASEBKGND消息。
消息循环是一个循环体,在这个循环体中,程序利用GetMessage函数不停地从消息队列中获取消息,然后利用DispatchMessage函数将消息发送到指定的窗口,也就是调用指定窗口的窗口过程,并传递消息及其参数。
几个重要的消息处理函数:
PostMessage:该函数将消息放到指定窗口的消息队列后立即返回。这种发送方式称为"邮寄"消息。如果消息队列中的邮寄消息缓冲区已满,则该函数返回错误值。在下一个消息循环中,由GetMessage函数获得这个消息之后,窗口才会处理该消息。PostMessage一般用于发送一些非关键性的消息。比如在MiniGUI中,鼠标和按键消息就是通过PostMessage函数发送的。
SendMessage:应用程序一般通过发送一条消息来通知窗口过程立即完成某项任务。该函数和PostMessage函数不同,它把一条消息发送给指定窗口的窗口过程,而且等待该窗口过程完成消息的处理之后才会返回。当需要知道某个消息的处理结果时,使用该函数发送消息,然后根据其返回值进行处理。
SendNotifyMessage:该函数和PostMessage消息类似,也是不等待消息被处理即返回。但和PostMessage消息不同,通过该函数发送的消息不会因为缓冲区满而丢失,因为系统采用链表的形式处理这种消息。通过该函数发送的消息称为"通知消息",一般用来从控件向其父窗口发送通知消息。
几个特定消息:
MSG_PAINT:
该消息在需要进行窗口重绘时发送到窗口过程。MiniGUI通过判断窗口是否含有无效区域来确定是否需要重绘。当窗口在初始显示、从隐藏状态变化为显示状态、从部分不可见到可见状态,或者应用程序调用InvalidateRect函数使某个矩形区域变成无效时,窗口将具有特定的无效区域。这时,MiniGUI将在处理完所有的邮寄消息、通知消息之后处理无效区域,并向窗口过程发送MSG_PAINT消息。
需要注意的是,应用程序在处理完该消息之后,应该直接返回,而不应该传递给默认窗口处理。