【问题标题】:Getting edit box text from a modal MFC dialog after it is closed关闭模式 MFC 对话框后获取编辑框文本
【发布时间】:2011-08-22 04:17:27
【问题描述】:

从模态 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;

它不起作用。

【问题讨论】:

    标签: visual-c++ mfc modal-dialog


    【解决方案1】:

    在调用 DoModal() 之前不会创建对话框及其控件,并且如前所述,在 DoModal() 返回时已经销毁。因此,您既不能在 DoModal() 之前也不能在之后调用 GetDlgItem()。将数据传递或检索到控件的解决方案是使用类中的变量。您可以在创建类实例时,在调用 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();
    

    【讨论】:

    • @abhinav 有一个勾号,你可以点击来表达这种情绪
    【解决方案2】:
    1. 打开对话框资源,右键单击文本框并选择“添加变量”,选择值类型和 CString
    2. 在对话框类中:关闭前,调用UpdateData(TRUE)
    3. 对话框外:

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

      //新值还在dlg.m_myVariableName中

    【讨论】:

      【解决方案3】:

      DoModal() 在对话框返回之前将其销毁,因此该值不再可用。

      很难说为什么要在对话框中设置m_pMainWnd。老实说,我不确定您要在那里做什么。这肯定会导致问题,因为现在AfxGetMainWnd() 已损坏。

      无论哪种方式,对话框销毁后都无法获取对话框的控件值。

      【讨论】:

      • 感谢您的评论,我对这个 vc++ mfc 非常陌生,即使它没有运行,我也删除了该行,您能否指出另一种从字段中提取数据的方法
      • 它没有从这里运行 ASSERT(::IsWindow(m_hWnd));
      • 它没有运行因为这个错误 ASSERT(::IsWindow(m_hWnd));
      【解决方案4】:

      我经常用

      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 是 Dialog 表单,您希望将数据获取到 mainform 。 获取数据后调用 SetModifiedFlag(true) 设置视图数据更新。 调用 UpdateAllViews(NULL) 将数据设置为 mainform

      【讨论】:

        【解决方案5】:

        这个解决方案可能看起来很长,这意味着已经为这个看似很小的任务编写了很多代码。 但是当我们在子窗口中有一个列表或树时,所有项目都在子窗口中创建 并且项目必须移动到父窗口, 那么这是有道理的。 本源代码可以方便地创建一个窗口,并在关闭前将窗口中的信息传递给父级。

            //copy the two functions in your code 
        
            //1-    bool peek_and_pump(void)
        
            //      template<class T,class THISCLASS>
            //2-    void TshowWindow(int id,T *&pVar,THISCLASS *ths)
        
            //and make two member variable
            // bool do_exit;
            // bool do_cancel;
            //in child dialog class.
            //set true value in do_exit in child dialog for exit
        
            CchildDialog *dlg;
        
            template<class T,class THISCLASS>
            void TshowWindow(int id,T *&pVar,THISCLASS *ths)
            {
                T *p=pVar;
                if(!p)
                    p= new T;
                if(p->m_hWnd)
                {
                    p->SetForegroundWindow();
                }
                else
                {
                    delete p;
                    p= new T;
                    if(!(p->m_hWnd && IsWindow(p->m_hWnd)))
                    {
                        p->Create(id,ths);
                        if(IsWindow(p->m_hWnd))
                            p->ShowWindow(TRUE);
                    }   
                }
                pVar=p;
            }
        
        
            bool peek_and_pump(void)
            {
                MSG msg;
        
            #if defined(_AFX) || defined(_AFXDLL)
                while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
                {
                    if(!AfxGetApp()->PumpMessage())
                    {
                        ::PostQuitMessage(0);
                        return false;
                    }
                }
                long lIdle = 0;
                while(AfxGetApp()->OnIdle(lIdle++))
                    ;
            #else
                if(::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                    ::TranslateMessage(&msg);
                    ::DispatchMessage(&msg);
                }
            #endif
        
                return true;
            }
        
            void CparentPage::OnBnClick1()
            {
                if(dlg)
                {
                    dlg->DestroyWindow();   
                }
                TshowWindow<CchildDialog,CparentPage>(IDD_DIALOG_child,dlg,this);
                dlg->GetDlgItem(IDC_EDIT_1)->SetWindowText("");
                dlg->m_temp_window.EnableWindow(FALSE);//enable or disable controls.
                dlg->UpdateData(false);//for to be done enable of disable or else.
                dlg->do_exit=false;
                dlg->do_cancel=false;
                while(dlg->do_exit==false)
                {
                    peek_and_pump();//wait for dlg->do_exit set true
                }
                if( dlg->do_cancel==false ) 
                {
                    CString str1;
                    dlg->GetDlgItem(IDC_EDIT_1)->GetWindowText(str1);
                    //or other member variale of CchildDialog
                    //after finish all work with dlg then destroy its.
                }
                dlg->DestroyWindow();   
                
        
            }
            
            void CchildDialog::OnBnClickedOk()
            {
                UpdateData();
                OnOK();
                do_exit=true;
                do_cancel=false;
            }
            void CchildDialog::OnBnClickedCancel()
            {
                OnCancel();
                do_exit=true;
                do_cancel=true;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-07
          • 2011-08-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多