消息循环 推荐你去看候捷的《深入浅出MFC》,说得详细!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就讨厌这样推荐别人去看书的回答! 等于没有说一样!本来很简单的几句话就讲完的道理,非要搞的神秘西西的!消息循环 简单的不能在简单了windows的机制 就是 消息的机制! 所以的命令 都是通过消息来进行的你在任何一个窗口上做的动作 都会有相应的消息在发送 接受 和处理!你可以通过在消息循环里 调用case WM_TIMER: MessageBox();break;case WM_LBUTTONDOWN: MyFunction();break;这样的代码来处理 你要处理的消息(这点HOOK 可以说是最明白了一个解释了) 在WinMain()函数中会看到消息循环的主体while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } GetMessage()用于接受消息,在接收到除 WM_QUIT 之外的任何一个消息后,GetMessage()都返回TRUE。如果GetMessage收到一个WM_QUIT消息,则返回FALSE,如收到其他消息,则返回TRUE。因此,在接收到WM_QUIT之前,带有GetMessage()的消息循环可以一直循环下去。只有当收到的消息是WM_QUIT时,GetMessage才返回FALSE,结束消息循环,从而终止应用程序。 GetMessage()接受到非WM_QUIT消息后,就进入消息循环。它首先要经过函数TranslateMessage()进行翻译,这个函数会转换成一些键盘消息,它检索匹配的WM_KEYDOWN和WM_KEYUP消息,并为窗口产生相应的ASCII字符消息(WM_CHAR),它包含指定键的ANSI字符.但对大多数消息来说它并不起什么作用,所以现在没有必要考虑它。 DispatchMessage()将消息传送给窗口所指定的 窗口过程 。 接下来windows调用 窗口过程 。窗口过程的任务是处理消息,也就是对不同消息进行不同的处理(响应),针对窗口过程编程也就是API编程的基本思路。 以下是一个典型的窗口过程。 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("你好!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } 别的不用管,就盯住 switch (message) { case ***: case ***: } 这个结构(这个词有点用词不当)。例如:对WM_PAINT消息的处理(这是一个改变窗口,如大小改变,或被别的窗口遮住后,产生的消息,),以上代码显示了 你好! 重复刚才的话,对不同的消息进行相应的处理,是API编程的基本思路。你不处理的消息Windows回传给DefWindowProc进行缺省处理。 处理完一个消息后,return 0 ;使程序退出窗口过程,回到消息循环,等待下一条消息。 总结一下:用户动作-----Windows接手后产生消息----程序用消息循环接受消息----DispatchMessage()将消息传送给windows----windows调用窗口过程----窗口过程处理消息----返回消息循环----等待下一条消息的产生(用户的下一动作) 建议你阅读Charles Petzold的《Windows程序设计》(5th)很清楚地 到vc知识库下载《SDK之路》NO.1也不错,这个帖子参考了以上的内容。 到vc知识库下载《SDK之路》NO.1也不错 那麽有谁知道怎麽在MFC中修改消息循环__CDialog::DoModal,但不影响对话框的使用 VC6.0开发环境中按F9不能设置断点了,而用鼠标单击那个设置断点的小手图标是可以的 2个cstring如何合成一个cstring? 多线程 使用CShockWaveFlash播放Flash,如何控制音量? C++头文件的一个问题? WINDOWINFO 这个东西需要什么头文件啊 如何读取word文档 如何打开另一个对话框 怎么调用数组对象里某个对象的成员? 求心电分析软件的说明书一份 奇怪的SetWindowPos!知情者请进 求助:有关MFC的消息循环。谢谢!
本来很简单的几句话就讲完的道理,非要搞的神秘西西的!消息循环 简单的不能在简单了
windows的机制 就是 消息的机制! 所以的命令 都是通过消息来进行的
你在任何一个窗口上做的动作 都会有相应的消息在发送 接受 和处理!
你可以通过在消息循环里 调用
case WM_TIMER:
MessageBox();
break;
case WM_LBUTTONDOWN:
MyFunction();
break;
这样的代码来处理 你要处理的消息(这点HOOK 可以说是最明白了一个解释了)
GetMessage()接受到非WM_QUIT消息后,就进入消息循环。它首先要经过函数TranslateMessage()进行翻译,这个函数会转换成一些键盘消息,它检索匹配的WM_KEYDOWN和WM_KEYUP消息,并为窗口产生相应的ASCII字符消息(WM_CHAR),它包含指定键的ANSI字符.但对大多数消息来说它并不起什么作用,所以现在没有必要考虑它。
DispatchMessage()将消息传送给窗口所指定的 窗口过程 。
接下来windows调用 窗口过程 。窗口过程的任务是处理消息,也就是对不同消息进行不同的处理(响应),针对窗口过程编程也就是API编程的基本思路。
以下是一个典型的窗口过程。
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ; switch (message) case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("你好!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ;
case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } 别的不用管,就盯住
switch (message)
{
case ***:
case ***:
}
这个结构(这个词有点用词不当)。例如:对WM_PAINT消息的处理(这是一个改变窗口,如大小改变,或被别的窗口遮住后,产生的消息,),以上代码显示了 你好!
重复刚才的话,对不同的消息进行相应的处理,是API编程的基本思路。你不处理的消息Windows回传给DefWindowProc进行缺省处理。
处理完一个消息后,return 0 ;使程序退出窗口过程,回到消息循环,等待下一条消息。
总结一下:用户动作-----Windows接手后产生消息----程序用消息循环接受消息----
DispatchMessage()将消息传送给windows----windows调用窗口过程----窗口过程处理消息----返回消息循环----等待下一条消息的产生(用户的下一动作)
建议你阅读Charles Petzold的《Windows程序设计》(5th)很清楚地
到vc知识库下载《SDK之路》NO.1也不错,这个帖子参考了以上的内容。