MFC之几类消息的区别

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

上一篇:Linux 系统报错 rcu_preempt detected stalls on CPUs/tasks


下一篇:c语言中的一些注意点