WM_CLOSE

我们有的时候为了屏蔽右上角关闭按钮,这样写代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
//右上角关闭按钮
void CUpdateProgramDlg::OnClose()
{
    //AfxMessageBox("OnClose");
    //CDialog::OnClose();
}
      
//取消按钮
void CUpdateProgramDlg::OnCancel()
{
    //AfxMessageBox("OnCancel");
    //CDialog::OnCancel();
}

但是这样写程序怎样退出呢?

正常写法 ::SendMessage(hWnd,WM_CLOSE,0,0);

但是用了上面代码屏蔽右上角关闭按钮以后,以上关闭窗体的代码也无效了。 我是没有想出什么好办法退出程序,希望某高手看见给出极品代码。

于是本人翻阅各种资料总结如下给大家分享,请大神们不要丢我 - -!


MFC关闭窗体流程:


流程一:当点击右上角关闭按钮时,流程如下:

1.窗口关闭的时候会给窗口过程发送一个WM_SYSCOMMAND消息。如:SendMessage(WM_SYSCOMMAND, SC_CLOSE, NULL);
2.窗口过程接收到WM_SYSCOMMAND消息后,会调用DefWindowProc来发送一个WM_CLOSE消息
3.如果不处理WM_CLOSE消息,DefWindowProc会默认调用DestroyWindow来发送WM_DESTROY消息
4.接收到WM_DESTROY消息后,调用PostQuitMessage发送WM_QUIT消息

5.CWinApp::Run收到WM_QUIT后结束内部消息循环,并调用ExinInstance函数,它是CWinApp的一个虚拟函数,可以由用户重载。 
6.最后回到AfxWinMain,执行AfxWinTerm,结束程序。 


流程二:当调用::SendMessage(AfxGetApp->GetMainWnd(),WM_CLOSE,0,0);方法时,流程如下:

1.发送一个WM_CLOSE消息
2.如果不处理WM_CLOSE消息,DefWindowProc会默认调用DestroyWindow来发送WM_DESTROY消息
3.接收到WM_DESTROY消息后,调用PostQuitMessage发送WM_QUIT消息
4.CWinApp::Run收到WM_QUIT后结束内部消息循环,并调用ExinInstance函数,它是CWinApp的一个虚拟函数,可以由用户重载。 
5.最后回到AfxWinMain,执行AfxWinTerm,结束程序。 


了解WM_SYSCOMMAND消息

从窗口系统菜单上发送该消息,实现窗口的最大化,最小化,移动,还原,移动等操作
假设在CWnd派生类中
如,关闭窗口SC_CLOSE
SendMessage(WM_SYSCOMMAND, SC_CLOSE, NULL);
最小化窗口SC_MINIMIZE
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, NULL);
窗口移动状态SC_MOVE

SendMessage(WM_SYSCOMMAND, SC_MOVE, NULL);



实例应用:

      我们了解了以上两种关闭窗体的流程以后,可以进行实际的应用。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//系统命令
void C...Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else if (nID == SC_CLOSE)//关闭按钮
    {
        //用户确认关闭窗体
        if(IDYES == MessageBox(NULL, "确认关闭" + fileNameChinese + "更新程序?","提示",MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL))
        {
            //退出应用程序
            ::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CLOSE,0,0);
        }
    }
    else if(nID == SC_MINIMIZE) //最小化,把他隐藏起来
    {
        this->ShowWindow(SW_HIDE);
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}


这样写我们就拦截了系统消息WM_SYSCOMMAND, 从而控制关闭按钮是否发送WM_COLSE消息。

就可以使用 ::SendMessage(hWnd,WM_CLOSE,0,0); 关闭窗体啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值