Получение текста окна редактирования из модального диалогового окна MFC после его закрытия - PullRequest
3 голосов
/ 10 мая 2011

Из модального диалогового окна MFC я хочу извлечь текст из поля редактирования после закрытия диалогового окна. Я попытался это:

CPreparationDlg Dlg;
CString m_str;

m_pMainWnd = &Dlg;
Dlg.DoModal();
CWnd *pMyDialog=AfxGetMainWnd();
CWnd *pWnd=pMyDialog->GetDlgItem(IDC_EDIT1);
pWnd->SetWindowText("huha max");
return TRUE;

Не работает.

Ответы [ 4 ]

21 голосов
/ 10 мая 2011

Диалог и его элементы управления не создаются до тех пор, пока вы не вызовете DoModal () и, как уже указывалось, будут уничтожены уже к моменту возврата DoModal (). Из-за этого вы не можете вызывать GetDlgItem () ни до, ни после DoModal (). Решением для передачи или извлечения данных в элемент управления является использование переменной в классе. Вы можете установить его при создании экземпляра класса перед вызовом DoModal (). В OnInitDialog () вы помещаете в элемент управления значение переменной. Затем, когда окно разрушено, вы получаете значение из элемента управления и помещаете его в переменную. Затем вы читаете переменную из вызывающего контекста.

Примерно так (обратите внимание, я набрал его прямо в браузере, поэтому могут быть ошибки):

class CMyDialog : CDialog
{
  CString m_value;
public:  
  CString GetValue() const {return m_value;}
  void SetValue(const CString& value) {m_value = value;}

  virtual BOOL OnInitDialog();
  virtual BOOL DestroyWindow( );
}

BOOL CMyDialog::OnInitDialog()
{
  CDialog::OnInitDialog();

  SetDlgItemText(IDC_EDIT1, m_value);

  return TRUE;
}

BOOL CMyDialog::DestroyWindow()
{
  GetDlgItemText(IDC_EDIT1, m_value);

  return CDialog::DestroyWindow();
}

Тогда вы можете использовать это так:

CMyDialog dlg;

dlg.SetValue("stackoverflow");

dlg.DoModal();

CString response = dlg.GetValue();
2 голосов
/ 12 мая 2011
  1. Откройте ваш диалоговый ресурс, щелкните правой кнопкой мыши на текстовом поле и выберите «Добавить переменную», выберите тип значения и CString
  2. В диалоговом классе: перед закрытием вызовите UpdateData(TRUE)
  3. За пределами диалогового окна:

    CPreparationDlg dlg(AfxGetMainWnd());
    
    dlg.m_myVariableName = "my Value"; 
    
    dlg.DoModal();
    

    // новое значение все еще находится в dlg.m_myVariableName

0 голосов
/ 23 марта 2017

Я часто использую

D_SOHINH dsohinh = new D_SOHINH();
    dsohinh.vd_kichthuoc=v_kichthuocDOC;
    dsohinh.vd_sohinh=v_soluongDOC;
    if(dsohinh.DoModal()==IDOK)
    {
        v_soluongDOC=dsohinh.vd_sohinh;
        v_kichthuocDOC=dsohinh.vd_kichthuoc;
    }
    SetModifiedFlag(true);
    UpdateAllViews(NULL);

С dsohinh это форма диалога, которую вы хотите получить данные для mainform.После получения данных затем вызовите SetModifiedFlag (true), чтобы установить обновление данных представления.вызвать UpdateAllViews (NULL), чтобы установить данные для mainform

0 голосов
/ 10 мая 2011

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

Трудно сказать, почему вы устанавливаете m_pMainWnd для своего диалога. Если честно, я не совсем уверен, что вы пытаетесь делать там. Это непременно вызовет проблемы, так как теперь AfxGetMainWnd() сломан.

В любом случае, вы не можете получить управляющие значения диалогового окна после его уничтожения.

...