看了好久但是还是不敢说自己弄得很明白了,不过以下大神的话是目前我觉得最清晰有理的,先记下来
其实问题的关键在于DispatchMessage到底干了什么
如果只是去调用相应的窗口,那自己写个switch不就可以了
DispatchMessage与switch不同之处在于DispatchMessage会
先调用windows,进入管态(大概是range 0),然后再由windows调用
窗口的函数。
为什么这么麻烦?
因为这样windows就可以知道你的程序运行到什么情况了,
windows来调用你的窗口,这样你的窗口返回的时候windows就知道
你已经处理过一个消息了,如果没有新的消息进入消息队列
windows就不再会给你的进程分配时间片
如果是你自己写switch的话,windows就不可能这样灵活的分配时间
资源利用率就会降低
那么还要消息循环干什么,windows直接把消息发给窗口不就可以了吗?
因为你要在消息循环里把KEY_DOWN和KEY_UP组合成WM_CHAR,
还可以直接屏蔽掉许多对你来说无用的消息,加快速度
DispatchMessage这一套机制大概是windows里最难理解的部分了(除了COM以外)
又看了看windows程序设计,补充一下,整个消息机制过程应该是这样的
1:我的窗口程序创建一个MSG
2: 当我点击了鼠标或键盘,该操作被windows系统捕捉到,系统把这一操作变成MSG放到它为我的程序所自动创建的消息队列里
3:我通过GeMessage或者PeekMessage取出这条消息,将消息内容放到我创建的MSG里面
4:我的程序调用函数TranslateMessage(&MSG),将我存储的消息地址发给系统,系统来转换键盘信息也就是系统帮我把MSG里存的内容变成我能处理的键盘信息,现在MSG里存的就是具体的操作信息了,比如按下的是空格还是回车
5:我的程序再调用函数DispatchMessage(&MSG),再将这个翻译过的消息发送个系统,由系统来调用我的WndProc函数,至于为什么上面的大神说过了
先这样理解吧