MFC中ProcessMessage()函数有啥作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中ProcessMessage()函数有啥作用?相关的知识,希望对你有一定的参考价值。

在一个SDI应用程序中,有一个按钮的消息响应函数里有下列代码:
void CSXS_testView::OnCapContinue()


…………
…………
while(stateRunning)

//执行测量操作
//进行数据处理采集
sxSystem.process();
//处理消息队列
ProcessMessage();
//更新窗口画面
Invalidate();
CTools::delayMsMessage(50);


…………
…………


其中,ProcessMessage()的定义为
void CSXS_testView::ProcessMessage()

//消息变量
MSG msg;
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))

TranslateMessage (&msg);
DispatchMessage (&msg);



我想知道ProcessMessage()是干什么用的,它在OnCapContinue() 消息响应函数中能完成什么功能?

在CSDN里找不到合适的回复,只能求助百度,希望大神能帮忙

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);

那就可以从消息队列处理消息,那就不会阻塞程序正常运行,否则,如楼上所说,假死状态。
参考技术A //处理消息队列
ProcessMessage();

注释中已经说的很明白了。在大的或者耗时较长的循环处理中,程序会不响应消息队列,这时候,程序界面不会刷新,点击也没有反应(死机状),如果要避免这种情况,就需要在循环中适当(也许每次循环,也许几次循环处理一次)通过手动代码响应和处理消息队列,这就是它的功能和作用。
参考技术B 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);

那就可以从消息队列处理消息,那就不会阻塞程序正常运行。

MFC中FormView和Dialog有啥区别?

【中文标题】MFC中FormView和Dialog有啥区别?【英文标题】:What are the differences between FormView and Dialog in MFC?MFC中FormView和Dialog有什么区别? 【发布时间】:2013-01-04 04:09:56 【问题描述】:

MFC中FormView和Dialog有什么区别?任何人都可以建议何时使用 FormView 以及何时使用 Dialog?

【问题讨论】:

【参考方案1】:

我不得不恭敬地不同意上面的帖子。 CFormView 和对话框没有区别

CFormView 是一个对话框,它以无模式创建并由框架作为客户端托管,并随着框架调整大小而调整大小。 它是从您必须提供的对话框资源创建的,就像任何独立对话框一样。对话框控件的所有消息处理程序都是相同的。

CFormView Create 成员调用 CreateDlg,传递由构造函数加载的对话框模板。 CWnd CreateDialog,调用 CreateDlgIndirect 成员,该成员又调用 CreateDialogIndirect API 创建无模式对话框。

您也可以在另一个对话框中嵌入无模式对话框,它仍然是一个对话框。

【讨论】:

【参考方案2】:

对话框应用程序只是显示一个对话框(以及您在对话框中放置的任何控件,以及您从中弹出的任何其他控件等)

FormView 为您提供了一个带有主菜单等的相当普通的应用程序——但视图部分也可以包含控件。

如果你只想要一个对话框,你会使用一个对话框,如果你想要(可能是多个)可以保存控件的视图,你会使用一个表单视图。最大的区别在于,将其设置为对话框会改变 整个 应用程序的基本性质,其中 formview 只更改一个视图 - 如果您(例如)也可以拥有其他(非表单)视图想要。

【讨论】:

【参考方案3】:

某人_笑脸

回答您关于对话框与 CFormView 的问题。

我很少使用基于对话框的应用程序;仅在需要简单任务而不需要更复杂 UI 开销的情况下。

大多数程序员从基于对话框的应用开始,在开始实现一些功能后,通常会发现应用需要菜单和工具栏和状态栏、数据存储/处理对象、命令路由处理等。

我建议使用不可调整大小的框架创建 SDI 应用程序。

您将免费获得 MFC 应用程序的对话框外观和所有功能。如果您不需要文档支持,则不必使用文档支持。

【讨论】:

【参考方案4】:

从编码人员的角度来看,FormView 支持以所见即所得的方式使用对话框资源布局 UI 控件。因此,当使用大量控件创建视图时,FormView 可能会有所帮助。

对话框不是视图。这是完全不同的。对话框是独立的窗口,通常以模式事件循环(或在特殊情况下无模式)呈现。

【讨论】:

没有单独的“模态事件循环”这样的东西。请注意,窗口的过程和它的消息循环之间是有区别的。

以上是关于MFC中ProcessMessage()函数有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

java中方法没有返回值用啥作返回类型

Phonegap:“processMessage failed”无法发送 javascript 函数 (Cordova 2.5.0)

mfc里SetTimer和Sleep有啥区别

.net类库和api mfc有啥区别呀??

Cordova processMessage 失败:堆栈:未定义(和)错误:非法访问

请问MFC中PostMessage()在此有啥作用呢?