1.ON_COMMAND与ON_UPDATE_COMMAND_UI

开发MFC程序,给菜单子项添加消息处理函数时,会碰到ON_COMMAND和ON_UPDATE_COMMAND_UI两个消息。

ON_UPDATE_COMMAND_UI消息:在处理菜单对应的用户界面显示状态时,可响应此消息对应的处理函数,把菜单项

ON_COMMAND消息:是对命令消息(菜单、工具条、状态栏、加速键等)处理函数相对应的消息映射宏。

ON_UPDATE_COMMAND_UI则是映射用户操作界面(主要是菜单状态)的函数的宏。用于在用户下拉菜单时,确定菜单子项的状态,如选中、变灰、打勾等。

以Winodows自带的记事本为例,它的"格式"菜单下有个“自动换行”子项。对文本换行或不换行的操作放在ON_COMMAND消息响应函数里,而“自动换行”菜单项左侧是否打勾的操作则放在ON_UPDATE_COMMAND_UI里。

2.WM_CLOSE、WM_DESTROY、WM_QUIT区别

WM_CLOSE:关闭窗口或整个程序前产生

假设一个应用程序有多个窗口,关闭任意一个窗口,都会触发那个窗口的WM_CLOSE消息。

特别地,退出程序时,即选了系统菜单里关闭选项或点了程序右上角X,也会产生WM_CLOSE消息。在SDI或MDI程序中,由CMainFrame的ONCLOSE处理。注意,为了使应用程序处理此消息(特指通过右上角的X关闭程序),要把ON_WM_CLOSE()宏放入BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间。另外一个要注意的地方是MFC窗口默认取消按钮函数OnCancel()不会触发WM_CLOSE消息,只触发WM_DESTROY。

WM_DESTROY:关闭窗口后产生,程序退出前产生。当收到WM_DESTROY消息的时候,窗口已经从视觉上被删除;但一个主窗口被关闭,并不意味着应用程序结束了,因为它可以在没有窗口的条件下继续运行。

WM_QUIT:关闭消息循环。如果希望关闭程序,在收到WM_DESTROY消息的时候,必须再发出一个WM_QUIT消息。

代码例子:

假设要实现一个菜单选项,关闭当前所有的窗口。实现思路就是遍历窗口句柄,然后向对应窗口发送WM_CLOSE消息。窗口只是被关闭了,但窗口消息循环仍在。

void CMainFrame::OnCloseAllWindows()
{
  CMDIFrameWnd* pWnd = (CMDIFrameWnd*)AfxGetMainWnd();
  ASSERT(pWnd != NULL);

  HWND hChild = ::GetWindow(pWnd->m_hWndMDIClient, GW_CHILD);
  CMDIChildWnd* pChild = (CMDIChildWnd*)CWnd::FromHandle(hChild);

  while(pChild != NULL)
  {
    pChild->PostMessage(WM_CLOSE);
    pChild = (CMDIChildWnd*)(pChild->GetNextWindow());
  }
}

MFC之几类消息的区别的更多相关文章

  1. MFC 虚函数与消息映射区别

    初学MFC添加函数时,总是纠结于是 Add  windows message handler or Add virtual function 说到底不理解MFC中虚函数与消息处理函数的设计区别 本人理 ...

  2. MFC中 Invalidate() , InvalidateRect() , UpdateWindow(), Redrawwindow() 区别

    1. void Invalidate( BOOL bErase = TRUE ); 该函数的作用是使整个窗口客户区无效.窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口 ...

  3. MFC OnOk(),OnCancel(),OnClose(),OnDestroy()的区别总结

    MFC OnOk(),OnCancel(),OnClose(),OnDestroy()的区别总结(转) 第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和O ...

  4. Win32 Console Application、Win32 Application、MFC三者之间的联系和区别

    转自:http://blog.csdn.net/c_base_jin/article/details/52304845 在windows编程中,我们或多或少都听说这三个名称,分别是Win32 Cons ...

  5. VC++、MFC、COM和ATL的区别

    今天看到的,感觉不错.转载了 一.什么是MFC 微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是W ...

  6. <MFC_1>深入剖析MFC的WinMain和消息机制

    一.开篇引论 熟悉Win32开发的朋友,应该非常了解它的基本组成和流程 1. WinMain:书写窗口类(WNDCLASS) -> 注册窗口类 -> 创建窗口 -> 显示窗口和更新窗 ...

  7. MFC自创建类了解

    CxxxxView 视窗类 所有的按键 等消息都先在这里响应 CxxxxDoc 文档类 CMainFrame 框架类 CxxxxApp 应用程序类 CxxxxView类中的 OnDraw函数 在窗口改 ...

  8. Windows的四类消息

    Windows的三类消息1.标准消息宏名称 对映消息 消息处理函数(名称已由系统预设)ON_WM_CHAR WM_CAHR OnCharON_WM_CLOSE WM_CLOSE OnCloseON_W ...

  9. MFC原理第五讲.消息映射.以及如何添加消息

    MFC原理第五讲.消息映射.以及如何添加消息 一丶消息映射是什么 我们知道.Win32程序.都是通过消息去驱动的. 不断的在处理消息. 只要我们使用固定的宏.就可以让我们的框架知道一旦消息发生.该往哪 ...

随机推荐

  1. max_delay/min_delay和input_delay/output_delay

    今天在使用DC设置随路时钟的时候发现里两个比较容易混淆的设置:max_delay/min_delay和input_delay/output_delay. 1)max_delay/min_delay设置 ...

  2. oracle优化(一)

    非原创 1. 选用合适的ORACLE优化器 ORACLE的优化器有3种: a. RULE(基于规则)b. COST(基于成本) c. CHOOSE(选择性) 选择缺省的优化器,可以通过对init.or ...

  3. css动画特效

    <html> <head> <meta charset="utf-8" /> <title>6种css3鼠标滑过动画效果</t ...

  4. Sql 根据当前时间,获取星期一具体日期

    --根据当前时间,计算每周一日期,周日为每周第一天 declare @getDate datetime --set @getDate='2018-12-30' set @getDate='2019-0 ...

  5. js二分算法排序

    var arr = [1,2,3,5,10,15,23,35,67,76,78,89,100];var len = arr.length;for (var i = 1; i < len; i++ ...

  6. n的m划分 整数拆分问题

    n的m划分 将n划分成若干个不超过m的数(正整数)的和,问有几种划分情况. 现在根据n和m的关系,考虑下面几种情况: 当n=1时,不论m的值为多少,只有一种划分,即{1}: 当m=1时,不论n的值为多 ...

  7. axios封装get方法和post方法

    我们常用的ajax请求方法有get.post.put等方法,相信小伙伴都不会陌生.axios对应的也有很多类似的方法,不清楚的可以看下文档.但是为了简化我们的代码,我们还是要对其进行一个简单的封装.下 ...

  8. dede织梦后台-退出空白,注销空白,打开空白,登录返回首页,登录返回登录页面

    24.php 5.4版本 后台500错误,打开空白的问题 不兼容 登录时空白 后台空白 24-1./include/userlogin.class.php 今天把电脑上的phpStudy升级到2013 ...

  9. IntelliJ IDEA2017 + tomcat 即改即生效 实现热部署

    https://www.cnblogs.com/1024zy/p/6344000.html

  10. mybatis中怎样使用having?

    1.dao层代码 List<ErgTipSimpleBo> queryListMore(@Param("typeId") Integer typeId,@Param(& ...