3 回答
TA贡献1790条经验 获得超9个赞
MFC SDI执行顺序大致是:AfxWinMain在WinMain这个程序入口点被调用,有个全局对象是theApp,它类型为你工程中派生自CWinApp的派生类类型。AfxWinMain调用其成员函数,初始化、然后创建窗口(CMainFrm),然后进入Run,在Run里
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//调用窗口对应的消息处理函数
TranslateMessage (&msg);
DispatchMessage (&msg);
}
而这个PeekMessage是从当前线程的消息队列获取消息。你程序中如果使用PostMessage则可以把消息放入消息队列,但是要等待上一条消息被处理完,如果使用SendMessage,就不用放入消息队列,直接响应,而MFC内部控制界面,如你的Invalidate();会PostMesage ,所以,你当前函数没退出,那就不能响应消息,于是,如果你在循环时
MSG msg;
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage (&msg);
DispatchMessage (&msg);}
那就可以从消息队列处理消息,那就不会阻塞程序正常运行,否则,如楼上所说,假死状态。
TA贡献1853条经验 获得超6个赞
//处理消息队列
ProcessMessage();
注释中已经说的很明白了。在大的或者耗时较长的循环处理中,程序会不响应消息队列,这时候,程序界面不会刷新,点击也没有反应(死机状),如果要避免这种情况,就需要在循环中适当(也许每次循环,也许几次循环处理一次)通过手动代码响应和处理消息队列,这就是它的功能和作用。
TA贡献1797条经验 获得超6个赞
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//调用窗口对应的消息处理函数
TranslateMessage (&msg);
DispatchMessage (&msg);
}
而这个PeekMessage是从当前线程的消息队列获取消息。你程序中如果使用PostMessage则可以把消息放入消息队列,但是要等待上一条消息被处理完,如果使用SendMessage,就不用放入消息队列,直接响应,而MFC内部控制界面,如你的Invalidate();会PostMesage ,所以,你当前函数没退出,那就不能响应消息,于是,如果你在循环时
MSG msg;
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage (&msg);
DispatchMessage (&msg);}
那就可以从消息队列处理消息,那就不会阻塞程序正常运行。
- 3 回答
- 0 关注
- 308 浏览
添加回答
举报