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

  • 相关阅读:
    Max直接输出gif的脚本
    MaxScript获取材质缩略图的方法
    关于Max导出插件的七七八八
    Max2013脚本工具的乱码问题
    MaxScript中获取Skin的骨骼的方式
    C\C++ Dll >C# >MaxScript通过C#调用C++写的Dll
    Unity3d的着色器
    半夜睡不着,爬起来把shaderX里的车漆搬到了unity3d里
    MaxScript保存剪贴板里的图像
    MaxScript通过Ole操作Phtoshop的范例,将几张图按图层合并为psd
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3852527.html
Copyright © 2011-2022 走看看