2011-05-24 64 views

回答

8

您不能更改DoModal()函數的返回值,即使可以,我也不會推薦它。這不是這樣做的慣用方式,如果您將其返回值更改爲字符串類型,則會失去查看用戶何時取消對話框(在這種情況下,返回的字符串值應完全忽略)的功能。 。

相反,添加其他功能(或多個)到您的對話框類,像GetUserName()GetUserPassword,再經過DoModal回報IDOK查詢這些功能的價值。

例如,顯示的對話框和處理用戶輸入可能是這樣的功能:

void CMainWindow::OnLogin() 
{ 
    // Construct the dialog box passing the ID of the dialog template resource 
    CLoginDialog loginDlg(IDD_LOGINDLG); 

    // Create and show the dialog box 
    INT_PTR nRet = -1; 
    nRet = loginDlg.DoModal(); 

    // Check the return value of DoModal 
    if (nRet == IDOK) 
    { 
     // Process the user's input 
     CString userName = loginDlg.GetUserName(); 
     CString password = loginDlg.GetUserPassword(); 

     // ... 
    } 
} 
+0

THX了很多,這真的幫助 – Karudi 2011-05-24 14:34:25

0

我不認爲這是可能的(或合理的)。 DoModal返回一個INT_PTR,通常用於瞭解用戶如何退出對話框(按OK,取消,出現錯誤...)。做到這一點的方法是有對話設置和對話的調用者可以訪問的公共成員或函數來知道值。 像這樣:

CMyDialog dlg; 

if(dlg.DoModal()==IDOK) 
{ 
    CString str1 = dlg.m_String1; 
    CString str2 = dlg.GetString2(); 
} 

這是你會用的CFileDialog,例如道路。

1

我在尋找答案,並同意在大多數情況下,您不會更改對話框的標準行爲。但是,如果您有幾個按鈕,並且希望特定地選擇頂部的OK與底部的OK,則可能有一種情況需要選擇用戶實際響應的內容。你知道的指標。

或者說,如果您希望稍微不同的結果,如果對話框在您的函數上運行時導致錯誤。如果返回的值不是IDOK,也可能是其他值。

我發現Dialog::EndDialog()與細節,在這裏使用的例子:MSDN: Dialog::EndDialog

#include "ANewDialog.h" 
void CMyWnd::ShowDialog() 
{ 
    CMyDialog myDlg; 
    int nRet = myDlg.DoModal(); 

    if (nRet == 18 ) 
     AfxMessageBox("Dialog closed. But there was a problem."); 
} 

/* MyDialog.cpp */ 
void CMyDialog::OnSomeButtonAction() 
{ 
    int nRet = 0; 

    // Run your function with return value; 
    nRet = YourReallyFunFunction(); 
    EndDialog(nRet); // Set the return value returned by DoModal! 

    return; // The dialog closes and DoModal returns here! 
} 
相關問題