精华内容
下载资源
问答
  • OnOK OnCancel OnClose OnDestroy
  • 按esc只会调用OnCancel() 按alt+f4会先调用OnClose()后调用OnCancel() 按X或关闭按扭时会先调用OnClose()后调用OnCancel()   第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy...

    按esc只会调用OnCancel()
    按alt+f4会先调用OnClose()后调用OnCancel()
    按X或关闭按扭时会先调用OnClose()后调用OnCancel()

     

    第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数。从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的“确定”、“取消”按钮则对应了CDialog。

    第二,OnClose()和OnDestroy()

    在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始)
    (1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose()
    (2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象
    (3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy()
    (4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环

    可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd对象告诉它即将被销毁,尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。

    第三,OnOK()、OnCancel()()、OnClose()、OnDestroy()

    CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框;  
    CDialog::OnCancel只调用CDialog::EndDialog关闭对话框;  
    OnClose()是响应   WM_CLOSE   的.一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM的消息映射机制。

    CDialog::EndDialog()-------->OnDestroy()

                     OnClose()-------->OnDestroy()

    EndDialog()和OnClose()属于“同级别”的,所以我们在按下OK按钮的时候,程序是不会执行OnClose()的,但两种机制都必须经过OnDestroy()。

    展开全文
  • MFC对话框中的OnCancel虚拟方法在如下三个时机被调用: 1、对话框按IDCANCEL按钮,直接通过CDialog的ON_COMMAND(IDCANCEL, &CDialog::OnCancel)的消息映射,触发对OnCancel的调用; 2、按ESC按键,在CDialog::...

    MFC对话框中的OnCancel虚拟方法在如下三个时机被调用:

    1、对话框按IDCANCEL按钮,直接通过CDialog的ON_COMMAND(IDCANCEL, &CDialog::OnCancel)的消息映射,触发对OnCancel的调用;
    2、按ESC按键,在CDialog::PreTranslateMessage中,调用CWnd::PreTranslateInput,进而调用CWnd::IsDialogMessage,接下来调用Windows API ::IsDialogMessage。在::IsDialogMessage处理中,应该(无法查看Windows源码,根据调试跟踪推测)SendMessage WM_COMMAND,ID为IDCANCEL,直接调用OnCancel;
    3、按对话框右上角“X”按钮,缺省的OnClose会调用CWnd::Default,继而调用CWnd::DefWindowProc,进一步调用::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam),推测CallWindowProc(无法查看Windows源码,根据调试跟踪推测)会投递(即PostMessage)一条WM_COMMAND消息,ID为IDCANCEL,从而触发OnCancel被调用。

    补充:

    对于1、IDCANCEL按钮的WM_COMMAND消息是子窗口(按钮)向父窗口发送消息(SendMessage),所以不经过CDialog::PreTranslateMessage,直接经过CDialog::OnCommand调用OnCancel;
    对于2、由于是SendMessage,也不再次经过CDialog::PreTranslateMessage,直接经过CDialog::OnCommand调用OnCancel;
    对于3、由于是投递的WM_COMMAND消息并且是顶级窗口的消息,会经过CWinApp::PreTranslateMessage,再流经CDialog::PreTranslateMessage,最后通过CDialog::OnCommand调用OnCancel。

    实验表明:如果是普通的框架窗口,处理OnClose的缺省操作会调用DestroyWindow关闭窗口,对于对话框窗口,是投递WM_COMMAND,控件ID是IDCANCEL。

    展开全文
  • 转载:https://www.cnblogs.com/BeyondTechnology/archive/2011/02/20/1959293.html推荐:深入浅出重载OnOK、OnCancel、OnCloseMFC默认建立的Dialog按Esc响应OnCancel,回车响应OnOK,都会关闭对话框,只要重载OnOk...

    转载:https://www.cnblogs.com/BeyondTechnology/archive/2011/02/20/1959293.html

    推荐:深入浅出

    重载OnOK、OnCancel、OnClose

    MFC默认建立的Dialog按Esc响应OnCancel,回车响应OnOK,都会关闭对话框,只要重载OnOk和OnCancel函数即可,但此时点击关闭按钮无法关闭窗口,还需要再重载OnClose函数。代码如下:

    void CMFCDemoDlg::OnBnClickedOk()
    {
     // TODO: Add your control notification handler code here
     //OnOK();
    }

    void CMFCDemoDlg::OnBnClickedCancel()
    {
     // TODO: Add your control notification handler code here
     //OnCancel();
    }

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

     OnCancel();
     //CDialog::OnClose();
    }

    总结OnOK()、OnCancel()、OnClose()、OnDestroy()之间的区别

    第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数。从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的“确定”、“取消”按钮则对应了CDialog。

    第二,OnClose()和OnDestroy()

    在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始)
    (1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose()
    (2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象
    (3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy()
    (4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环

    可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd对象告诉它即将被销毁,而后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。

    第三,OnOK()、OnCancel()()、OnClose()、OnDestroy()

    CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框;   
    CDialog::OnCancel只调用CDialog::EndDialog关闭对话框;   
    OnClose()是响应   WM_CLOSE   的.一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM的消息映射机制。

    CDialog::EndDialog()-------->OnDestroy()

                     OnClose()-------->OnDestroy()

    EndDialog()和OnClose()属于“同级别”的,所以我们在按下OK按钮的时候,程序是不会执行OnClose()的,但两种机制都必须经过OnDestroy()

    展开全文
  • 深入理解OnOK与OnCancel

    2017-06-14 17:11:44
    这几天调一个程序时,遇到一个和OnOK, OnCancel有关的bug, 于是整理一下写了下面这篇文章。 首先OnOK是对ID_OK的响应, OnCancel是对IDCANCEL的响应. 前者对应键盘的Enter, 后者对应Esc.   两个函数都是...

    这几天调一个程序时,遇到一个和OnOK, OnCancel有关的bug, 于是整理一下写了下面这篇文章


    首先OnOK是对ID_OK的响应, OnCancel是对IDCANCEL的响应前者对应键盘的Enter, 后者对应Esc.

     

    两个函数都是CDialog类的virtual的成员函数也就是MFC是希望你去重载它们两个函数有一个共同点,就是都会调用EndDialog. 当然是调用CDialogEndDialog. 那么这个EndDialog做个什么事呢看看MSDN上怎么说.

    下面这段是从MSDN上摘下来的:


    Call this method to destroy a modal dialog box

    Do not call EndDialog to destroy a modeless dialog box. Call CWindow::DestroyWindow instead


    从这段英文可以获得两个信息有模式的对话框可以用EndDialog来销毁无模式的对话框要用DestroyWindow来销毁而这一点,MSDNOnOK的函数说明了也做了强调,内容如下:


    If you implement the OK button in a modeless dialog box, you must override the OnOK method and call DestroyWindow inside it. Do not call the base-class method, because it calls EndDialog which makes the dialog box invisible but does not destroy it.


    为什么强调用谁来销毁,因为这牵涉到资源释放的问题比如当你的这个对话框是无模式的,你关闭对话框时,就不能只调用CDialogOnOK, 还应该DestroyWindow,像下面这样:

    1. void CMyDlg::OnOK()  
    2. {  
    3.  CDialog::OnOK();//第一步,关闭窗口  
    4.  DestroyWindow();//第二步,释放资源  
    5. }  
    void CMyDlg::OnOK()
    {
     CDialog::OnOK();//第一步,关闭窗口
     DestroyWindow();//第二步,释放资源
    }

    那么怎么判断对话框是有模式的还是无模式的呢,很简单,如果你的对话框是用DoModal生成,它就是有模式的,如果是用Create生成的,它就是无模式的. 假设现在你用VC新建一个基于对话框的应用, 这个默认生成的对话框就是一个有模式的对话框。

    展开全文
  • 第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,  即WM消息响应函数。 从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框  中的...
  • MFC 之 OnClose 与 OnCancel

    2018-05-23 10:26:56
    在一个对话框当中,按下esc键 与 上面的红叉,默认都是调用OnCancel()函数;现在我要在按下esc键盘后不关闭程序而是弹出一个对话框,但是这个时候点击红叉程序也不会关闭,为了解决这个问题,我们就要重载OnClose...
  • ll notice that we need to be able to distinguish any random error thrown in <code>onCancel()</code> from the intentional <code>Cancelled</code> error. To do so, we'll need to clearly identify ...
  • OnOK()与OnCancel()

    千次阅读 2016-12-02 11:21:10
    首先OnOK是对ID_OK的响应, OnCancel是对IDCANCEL的响应. 前者对应键盘的Enter, 后者对应Esc. MFC: 1、Called when the user clicks the OK button (the button with an ID of IDOK). 2、The framework calls ...
  • handle onCancel?

    2020-12-26 01:51:29
    <div><p>how to handle cancel ? <pre><code>Goldfinger.Callback()</code></pre> <p>only has </p><pre><code>onResult</code></pre> <p>and </p><pre><code>onError</code></pre> 该提问来源于开源项目:...
  • 我们知道,在对话框中,屏蔽ESC键自己主动退出能够选择重载OnCancel为哑函数的方法: void CXXXXDlg::OnCancel() { // TODO: Add your specialized code here and/or call the base class //CDialog::...
  • 【转】关闭对话框,OnClose和OnCancel MFC中屏蔽ESC和回车关闭对话框 我们知道,在对话框中,屏蔽ESC键自动退出可以选择重载OnCancel为哑函数的方法: void CXXXXDlg::OnCancel() { // TODO: Add ...
  • CDialog OnOK OnCancel的区别

    千次阅读 2010-11-30 15:47:00
    OnOk会调用UpdateData(),导致控件变量被改变OnCancel不会
  • 友盟社会化sdk,qq分享回调无论成功失败全部跳转onCancel解决方法:application中的qqid和manifests的qqid需要填写同一个,如果用默认的就全都用默认id。
  • 主要描述了OnOK()、OnCancel()、OnClose()、OnDestroy等几个函数的调用次序等。
  • 第一,OnOk()和OnCancel()是CDialog基类的成员函数,即ID为ID_OK和ID_CANCEL的按钮的通知消息的响应函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数第二,OnClose()和OnDestroy()在对话框...
  • 1.void CCOMDDlg::OnCancel() { // TODO: Add extra cleanup here CDialog::OnCancel();} 如果把CDialog::OnCancel();注释掉,那么点击按钮ESC或者鼠标点击X将无法关闭整个窗口。 2.BOOLCTestDlg::OnInitDialog()...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,792
精华内容 5,516
关键字:

oncancel