1. 程式人生 > >關閉對話方塊,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
     }

      但是,這樣一來,右上角的關閉按鈕也不起作用了,是因為點選關閉按鈕時會自動呼叫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() 返回 後,如果採用訊息,我覺得是否應該不會在返回後呼叫,而應該在訊息傳送後馬上處理。

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

相關推薦

關閉對話方塊OnCloseOnCancel

      我們知道,在對話方塊中,遮蔽ESC鍵自動退出可以選擇過載OnCancel為啞函式的方法:      void CXXXXDlg::OnCancel()      {         // TODO: Add your specialized code here

關於EasyUI對話方塊表格選單元件在IE下的相容性處理方法

EasyUI版本:V1.4 JQuery版本:V1.11.1 一、對話方塊 定義對話方塊: <div id="test_dialog" class="easyui-dialog" closed

彈出對話方塊點選確定關閉對話方塊返回值給父頁面

父頁面: <input id="btnSelect" type="button" value="..."  onclick="organTree('txt_GLJG','hid_gljg');" class ="btn" /> <script typ

JavaScript操作BOM物件 - document物件; history location物件 對話方塊Date時間物件

getElementById返回擁有指定id的第一個物件(注意只是一個且是第一個)getElementsByName返回帶有指定名稱的物件集合getElementsBytagNam返回指定標籤的物件集合例html程式碼<div class="content" > <div cl

(shell練習1)zenity圖形介面之資訊對話方塊單複選對話方塊以及whilefor迴圈的練習

涵蓋內容包括 1,shell的while迴圈 2,shell的for迴圈 3,shell關於字串的擷取(精華之處) 4,shell的選擇分支語句if 5,zenity資訊對話方塊 6,zenity單選對話方塊 7,zenity複選對話方塊  8,shell不

【Bootstrap】一個在當前網頁彈出的對話方塊可以關閉不用跳轉非彈窗

使用彈窗在網頁中顯示簡訊息還行,雖然不那麼地友好。然而,彈窗對於如同網站服務條款的長資訊就無能為力的了。這是需要使用一個叫模態框modal的東西,並且在模態框裡面嵌入一個多行文字框textarea。 這個東西,如果要手工寫JavaScript程式碼就太難做了,但是使用Boo

pyqt彈出新對話方塊以及關閉對話方塊獲取資料

from PyQt4 import QtGui,QtCore import sys class Web_Browser(QtGui.QDialog): def __init__(self,parent=None): QtGui.QWidget.__i

java 自定義確認取消的Dialog對話方塊10秒之後自動關閉

 問題如下:  點選一個按鈕,彈出一個對話方塊,對話方塊裡面包含 確定 和 取消 按鈕 若點選確定,返回值為0,點選取消,返回值為1 若超過10秒不點選,提示視窗自動關閉,返回值為-5 後續可以根據返回值來做各種不同的判斷。 1.TimerTest 主程式,先執行main方

QT對話方塊去掉幫助關閉按鈕 攔截QT關閉視窗的CloseEvent

建了一個對話方塊,我不想把邊框去掉,只想去掉關閉按鈕, setWindowFlags(windowFlags()&~Qt::WindowCloseButtonHint&~Qt::WindowContextHelpButtonHint); 結果那個問號的按鈕

怎樣在關閉窗體時彈出一個確認對話方塊確定再退出?

         private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)           {       

MFC建立銷燬開啟模式對話方塊關閉模式對話方塊等函式呼叫順序

MFC應用程式建立視窗的過程1.PreCreateWindow()   該函式是一個過載函式,在視窗被建立前,可以在該過載函式中改變建立引數        (可以設定視窗風格等等)2.PreSubclassWindow() 這也是一個過載函式,允許首先子分類一個視窗3.OnG

QT開啟檔案--對話視窗名稱路徑提取

QT一般要用到檔案選操作,以開啟圖片為例,以下為部分程式碼: QImage openImage() { QString filename = QFileDialog::getOpenFileName(this, tr("choose a pic"), "", tr("Imag

MFC子對話方塊呼叫主對話方塊的變數函式

1、在子對話方塊中定義主對話方塊的物件指標: CSensorSysDlg *parent = (CSensorSysDlg*)GetParent();//CSensorSysDlg是主對話方塊對應的類 2、呼叫 //呼叫變數 parent->i;//i是主對話方塊內int型別的

SQL Sever無法開啟連結對話方塊未將物件引用設定到物件的例項。(AppIDPackage)

SQL Sever無法開啟連結對話方塊,未將物件引用設定到物件的例項。(AppIDPackage) 一般會出現這問題的原因是:安裝了VS。 一:C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\找到machine.config,把它刪除

phpstorm IDEA 雙擊Shift鍵會彈出 SearchEverywhere 對話方塊如何取消這個功能

解決方法:一:Open lib/resources.jar/idea/PlatformActions.xml and remove or comment such line:   <action id="SearchEverywhere" class="com.intel

純JS實現Toas對話方塊無HTML結構

<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title>toast</tit

MFC如何拷貝資源(對話方塊工具欄等)

 MFC的資源機制是兩個檔案的配合,xxx.rc(xxx為專案名稱)檔案和resource.h檔案的配合,res.rc以指令碼的形式描述了資源的形式,如***對話方塊大小,ID,有什麼按鈕,按鈕的ID等等 如“關於”對話方塊在rc檔案內的描述(怎麼開啟,找到rc檔案,資源管

Qt 新增一個QFrame的對話方塊設定按鈕的樣式表

新增一個QFrame的對話方塊 設定按鈕的樣式表 QPushButton#pdf2file { border:0px; background-image:url(:/images/btn-menu-02.png); font:16px "微軟雅黑"; colo

對話方塊選單如何響應:ON_UPDATE_COMMAND_UI訊息

需要增添虛擬函式: BOOL CXXXDlg::ContinueModal() {     CMenu*   p_main_mu = this->GetMenu();     CCmdUI   cmd_ui;     for(u_int n = 0; n < p_main_mu->

在標籤控制元件中放入對話方塊對話方塊裡是列表

背景:公司要求將相關資訊顯示在列表中,且利用標籤控制元件來進行切換。 問題描述:之前是將相關列表的初始化是放在對話方塊的OnInitDialog()函式中,且保證了標籤控制元件的切換沒有問題。但是在切換的過程中,當焦點不在標籤項,點選其它標籤項再切換到原標籤項時,原標籤項中並不能顯示出