Могу ли я вернуть пользовательское значение из функции DoModal диалогового окна? - PullRequest
2 голосов
/ 24 мая 2011

Что я хочу сделать, это после создания диалогового окна с DoModal() и нажатия OK в поле, чтобы выйти из него, чтобы было возвращено пользовательское значение. Например, пару строк, которые пользователь вводит в диалоговом окне.

Ответы [ 3 ]

8 голосов
/ 24 мая 2011

Вы не можете изменить возвращаемое значение функции 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();

        // ...
    }
}
1 голос
/ 02 апреля 2013

Я искал ответ и согласен, что в большинстве случаев вы не изменили бы стандартное поведение диалога. Но может случиться так, что вы захотите выбрать то, что пользователь на самом деле отвечает, если у вас есть несколько кнопок и вы хотите, чтобы они выбирали 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!
}
0 голосов
/ 24 мая 2011

Я не думаю, что это возможно (или разумно).DoModal возвращает INT_PTR, который обычно используется, чтобы узнать, что пользователь сделал для выхода из диалогового окна (нажмите ОК, Отмена, произошла ошибка ...).Способ сделать это состоит в том, чтобы иметь открытые члены или функции, к которым диалоговый набор и вызывающий диалог могут обращаться, чтобы узнать значения.Вот так:

CMyDialog dlg;

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

Так вы бы, например, использовали CFileDialog.

...