zoukankan      html  css  js  c++  java
  • 窗口关闭的消息路由

    有时候当我们点击窗口右上角的关闭按钮时,窗口在关闭之前会弹出一个提示对话框,

    询问我们是否真的要关闭窗口 。当我们点击确定以后,窗口会正常关闭,否则一切如常。

    那么上面的功能是如何实现的呢?

    让我们先来了解一下窗口关闭时的消息路由:

    首先当我们点击关闭按钮后,窗口会发出WM_SYSCOMMAND消息,此消息会交由默认的消息处理函数处理,

    默认的消息处理函数会发出WM_CLOSE消息。该消息会由默认消息处理函数调用DestroyWindow()处理,

    DestroyWindow()用来销毁窗口,也就是说让窗口从我们眼前消失。DestroyWindow()又会发出

    WM_DESTROY消息,注意此消息为不进队消息,会直接发给它的消息处理函数处理即默认消息处理函数。

    默认消息处理函数会调用PostQuitMessage()处理该消息,并发出WM_QUIT消息。当消息循环接受到此

    消息时会中止消息循环,进而退出应用程序。

    我们可以利用上面的消息路由实现我们开始提到的功能,消息路由中有两个消息最有利用价值WM_CLOSE和

    WM_DESTROY,那我们该拦截哪个呢?很多人会选择后者,但是WM_DESTROY消息发出时,窗口已经没了!

    所以我们应该拦截WM_CLOSE消息。

    下面分别是基于对话框核单文档的程序处理

    对话框:

    给对话框添加一个WM_CLOSE消息处理函数,在该函数中处理

    void CProgramDlg::OnClose()
    {
     // TODO: Add your message handler code here and/or call default
     if(IDOK==MessageBox("你真的要关闭窗口吗?","小提示",
                      MB_OKCANCEL|MB_ICONINFORMATION))
            CDialog::OnClose();
    }

    单文档:

    给单文档添加一个WM_CLOSE消息(框架窗口)处理函数,在该函数中处理,

    void CMainFrame::OnClose()
    {
     // TODO: Add your message handler code here and/or call default
     if(IDOK==MessageBox("你真的要关闭窗口吗","小提示",
                      MB_OKCANCEL|MB_ICONEXCLAMATION))
           CFrameWnd::OnClose();
    }

  • 相关阅读:
    Charles 环境安装
    postman的安装指南
    python-web自动化-三种等待方式(元素定位不到一)
    如何查找MySQL中查询慢的SQL语句
    1023 组个最小数
    linux学习笔记01
    P6461 [COCI2006-2007#5] TRIK
    P1181 数列分段Section I
    P4414 [COCI2006-2007#2] ABC
    如何安装oracle
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3852527.html
Copyright © 2011-2022 走看看