程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 關閉對話框,OnClose和OnCancel

關閉對話框,OnClose和OnCancel

編輯:.NET實例教程

 我們知道,在對話框中,屏蔽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() 返回 後,如果采用消息,我覺得是否應該不會在返回後調用,而應該在消息發送後馬上處理。 



本文來自CSDN博客,轉載請標明出處:http://blog.csdn.Net/silvervi/archive/2009/12/17/5027100.ASPx
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved