關閉對話框,OnClose和OnCancel

      我們知道,在對話框中,屏蔽ESC鍵自動退出可以選擇重載OnCancel爲啞函數的方法:

 

     void CXXXXDlg::OnCancel()
     {
        // TODO: Add your specialized code here and/or call the base class

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

      但是,這樣一來,右上角的關閉按鈕也不起作用了,是因爲點擊關閉按鈕時會自動調用CXXXXDlg::OnCancel()l從而完成對話框的關閉,由於CXXXXDlg::OnCancel()中什麼也沒有做,因此對話框就無法關閉。修改這個bug需要重載OnClose消息函數:

 

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

 

            CDialog::OnCancel();  //add OnCancel here


            CDialog::OnClose();           
      }

 

        由於OnCancle實際上是調用Enddialog(IDCANCEL),所以也可以按照如下修改:

 

 

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

 

             EndDialog(IDCANCEL); 


            CDialog::OnClose();           
      }

 

      我們知道OnClose函數是WM_CLOSE消息的響應函數,但是爲什麼發送WM_CLOSE消息後會自動調用CXXXXDlg::OnCancel()?自己跟了一下代碼,大致梳理了一下流程:

 

           WM_CLOSE

     -> 進入void CXXXXDlg::OnClose()

     -> CDialog::OnClose()        

     -> void CXXXXDlg::OnClose()返回

     -> void CXXXXDlg::OnCancel()

      比較神奇的是 CDialog::OnClose() 函數:

     

      這個函數中不知道以何種方式告知系統在 CXXXXDlg::OnClose() 返回 後去調用 CXXXXDlg::OnCancel(),在調試中如果把這個函數註釋掉,則不會轉入CXXXXDlg::OnCancel()函數中。而且,對於CXXXXDlg::OnCancel()函數的調用是在CXXXXDlg::OnClose() 返回 後,如果採用消息,我覺得是否應該不會在返回後調用,而應該在消息發送後馬上處理。

      

       網上找了很久也沒有得到答案,暫時記錄在此,也許哪天自己明白了,或是被牛人發現了給出解答。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章