2011-06-20 113 views
2

語言: C++MFC確定/取消對話框按鈕覆蓋?

開發環境:微軟的Visual C++

用於圖書館: MFC

相當新的MFC,如此忍受我。我有一個通過DoModal()啓動的對話框。我正在嘗試將按鈕添加到此對話框中,以取代默認的「確定」和「取消」按鈕。現在,我無法弄清楚如何做到這一點。我刪除了「確定」和「取消」按鈕,並添加了具有新ID的新按鈕,添加了事件處理程序,以及一些簡單的代碼,供他們按下時執行,但我無法使其工作。

我懷疑它與DoModal()期望OK或Cancel的響應有關,但沒有其他。雖然我不確定。任何幫助將不勝感激!

編輯:刪除代碼添加爲參考。

void CPrefsDlg::Launch() { 

[ ... ] 

    CSAPrefsDialog dlg; 

    INT_PTR nRet = -1; 
    nRet = dlg.DoModal(); 

    // Handle the return value from DoModal 
    switch (nRet) 
    { 
    case -1: 
    AfxMessageBox("Dialog box could not be created!"); 
    break; 
    case IDABORT: 
    // Do something 
    break; 
    case IDOK: // This works just fine. 
    exit(0); 
    break; 
    case IDSAVEONE: // This does not work. 
    MessageBox("Save One"); 
    break; 
    default: 
    break; 
    }; 
} 

void CPrefsDlg::SaveOne() 
{ 
// I tried adding in my own handler for 'Save One'...this does not work. 
MessageBox("Save one"); 
} 
+0

@Jon:您需要發佈一些代碼來演示問題,並指定「我無法使其工作」的含義。 – razlebe

+1

我已經添加了一些代碼。讓我知道如果它仍然不清楚。 – Jon

+0

@Rup編輯上面的代碼,以反映我以前有過的,也沒有工作。 – Jon

回答

5

要連接的對話框來終止並返回IDSAVEONE,你需要點擊處理程序添加到保存一個按鈕,並有它調用的EndDialog:

void CSAPrefsDialog::OnBnClickedSaveone() 
{ 
    EndDialog(IDSAVEONE); 
} 

如果通過對話框編輯器添加點擊處理程序(例如,通過雙擊你的按鈕),然後將生成必要的框架代碼,以便將其連接起來;否則,你就需要將下面一行添加到您的BEGIN_MESSAGE_MAP節在對話框類:

ON_BN_CLICKED(IDSAVEONE, &CSAPrefsDialog::OnBnClickedSaveone) 

但(作爲AJG85的只是打我發帖)根據操作是什麼,它的速度有多快,以及是否想要在首選項對話框中報告錯誤,您可能只想在您的點擊處理程序中執行額外的功能。

+0

我決定給你最好的答案,因爲你走過了它......我實際上使用你的評論來弄清楚,而AJ發佈了類似的東西。我希望我可以把它給你們,但我會給你:) – Jon

+0

+1:對於'EndDialog',如果他想關閉它並點擊保存按鈕,我將其作爲一個選項離開。 – AJG85

+0

謝謝,還有我的AJG +1。對不起,我花了這麼長時間才弄清楚這一點 - 我還沒有和MFC合作多年。 – Rup

3

MFC內置了確定和取消按鈕的ID。那些是IDOK和IDCANCEL。您可以通過返回DoModal()在交換機中處理這些問題,或者更好的方法是覆蓋對話類中的OnOK()OnCancel()方法以執行您想要的操作。

可以通過添加一行消息映射爲此打電話給你的處理程序:

編輯:同樣的事情對你的作品添加到我加入到我下面的示例代碼對話框按鈕:

BEGIN_MESSAGE_MAP(MyDialog, CDialog) 
    ON_BN_CLICKED(IDOK, &OnBnClickedOk) 
    ON_BN_CLICKED(IDSAVEONE, &OnBnClickedSave) 
END_MESSAGE_MAP() 

void MyDialog::OnBnClickedOk() 
{ 
    // do extra stuff when they click OK 

    CDialog::OnOK(); // call base class version to complete normal behavior 
} 

void MyDialog::OnBnClickedSave() 
{ 
    // this would be called for your save button with custom id IDSAVEONE 

    // note: no base class call here as it's specific to your dialog 
} 
+2

應該注意的是,如果您按Esc鍵或單擊對話框右上角的關閉(X)按鈕,也會調用OnCancel。 –

+0

@Mark好注意,默認情況下,按Enter設置爲「接受」按鈕的按鈕將被觸發。我相信這個屬性被命名爲_Default Button_ – AJG85