MFC 之 OnClose 与 OnCancel

在一个对话框其中。按下esc键  与 上面的红叉,默认都是调用OnCancel()函数。

如今我要在按下esc键盘后不关闭程序而是弹出一个对话框,可是这个时候点击红叉

程序也不会关闭,为了解决问题。我们就要重载OnClose函数,

void CMy1223Dlg::OnCancel()
{

	MessageBox("假设出来真奇怪","提示",MB_OK);
	//CDialog::OnCancel();
}

void CMy1223Dlg::OnClose()
{
	// TODO: Add your message handler code here and/or call default

	CDialog::OnClose();

}

这样调用后。点击红叉,却发现也会弹出这个对话框:

由于OnClose()缺省进入IDCANCEL的消息 ,OnClose()会进入CMy1223Dlg::OnCancel()函数;

void CMy1223Dlg::OnCancel()
{

	MessageBox("假设出来真奇怪","提示",MB_OK);
	//CDialog::OnCancel();
}

void CMy1223Dlg::OnClose()
{
	// TODO: Add your message handler code here and/or call default
	CDialog::OnCancel();
	//CDialog::OnClose();

}

所以要想OnClose关闭不进入派生类的OnCancel(CMy1223::OnCancel)函数,那么就在OnClose函数里面直接调用父类的OnCancel(CDialog::OnCancel);

CDialog::OnCancel();里面调用 EndDialog(IDCANCEL);所以也能够直接调用 EndDialog(IDCANCEL)

至于为什么OnClose函数要进入OnCancel函数。我认为非常奇怪的做法,原因不明,网上找了非常多也没有说清楚的!

时间: 2024-08-06 20:03:37

MFC 之 OnClose 与 OnCancel的相关文章

关闭对话框,OnClose和OnCancel

我们知道,在对话框中,屏蔽ESC键自己主动退出能够选择重载OnCancel为哑函数的方法: void CXXXXDlg::OnCancel()      {         // TODO: Add your specialized code here and/or call the base class //CDialog::OnCancel(); //disable OnCancel } 可是,这样一来,右上角的关闭button也不起作用了,是由于点击关闭button时会自己主动调用CXXX

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

MFC OnOk(),OnCancel(),OnClose(),OnDestroy()的区别总结(转) 第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即 WM消息响应函数.从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的“确定”.“取消”按钮则对应了CDialog. 第二,OnClose()和OnDestroy() 在单视图程序中,根据<<深入浅出MFC>>

MFC中模态对话框和非模态对话框

MFC的对话框非为两种,一种叫模态对话框(Modal  Dialog  Box,又叫做模式对话框),一种叫做非模式对话框(Modaless Dialog Box,又叫无模式对话框).两者的区别在于当对话框打开的时候,是否允许用户进行其他对象的操作. 一.模态对话框 模态对话框指,当用户需要对该对话框之外的其他对话框或者模块进行操作时,必须该对话框关闭,才能去编辑其他对话框或者模块. 创建如下: //创建模态对话框 CModalDialog modalDialog; modalDialog.DoM

MFC模式对话框与非模式对话框 消息处理顺序

对话框有两种创建方式:DoModal和Creat. 其中DoModal创建的是模态的对话框,而Creat创建的是非模态的对话框下面总结下他们的不同. 对于模态的对话框,在该对话框被关闭前,用户将不能在同一应用程序的其他地方进行工作(例如open file对话框),而对于非模态的对话框,在它留在屏幕上的同时可以在其他的地方进行工作,(例如find file对话框) Create的Dialog一般是modalless,如果你的程序本身就是只有一个Dialog,就无所谓了,看不出modalless的效

MFC中的模态对话框与非模态对话框

模态对话框创建: MyDialog mydlg; mydlg.DoModal() 当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行. 模态对话框的关闭顺序: OnClose:按关闭符号X后,响应WM_CLOSE消息 OnKillFocus:窗口即将失去输入焦点,响应WM_KILLFOCUS消息 OnDestroy:窗口即将被销毁时,响应WM_DESTROY消息 OnNcDestroy:窗口被销毁或,响应WM_NCDESTROY消息 PostNcDestroy:由

MFC应用程序中处理消息的顺序

应用程序处理消息的过程: 1.AfxWndProc()        该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数 3.WindowProc()       该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.OnWndMsg()         该

MFC 课程总结

<基于MFC框架开发>马志国 1491989781 MFC课程的组成 1.1 MFC应用程序的组成部分.执行机制和执行流程(10.5天). 1.2 Windows平台上的数据库访问技术(1.5天) MFC的ODBC类和Ado组件 1.3 Windows平台上的网络通信编程 (1天) 基本的socket函数和MFC的socket类 1.4 项目:远程控制系统 (3天)2 MFC课程目标 2.1 掌握MFC的原理和机制 2.2 熟练掌握断点调试和查看堆栈调用,了解函数的调用关系. 2.3 熟练掌握

(转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目comm 注意:点击ok,然后next,这时候要将application type改成dialog base.接着next到最后一个对话框是将generated dasses改成CcommDlg,然后finish 4, 将新生成的项目的对话框默认dialog edit删去,如图 5,在对话框中加入两个st

MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4. PreTranslateMessage 5. WindowProc 6. OnCommand 7. OnNotify 8. OnChildNotify 9. DefWindowProc 10. DestroyWindow 11. PostNcDestroy CWnd作为MFC中最基本的与窗口打交