2013-02-14 89 views
1

我正在处理MFC对话框,我不确定如何从非成员访问对象的成员变量(编辑控件,按钮,复选框等)功能。在非成员函数中访问MFC对话框的成员变量

由于对象是任何的.cpp创建,所有的目标事件在whateverDlg.cpp处理,而后者#include的是前者,我无法用常规手段获得DLG的成员。

举例说明:

void BlahDlg::OnBnClickedblah() 
{ 
    //... 
    CString text = L"blahblahblah"; 
    m_bEditControl.SetWindowTextW(text.GetBuffer()); //works fine 
    //... 
} 

void nonMember() 
{ 
    //... 
    CString text = L"blahblahblah"; 
    m_bEditControl.SetWindowTextW(text.GetBuffer()); //m_bEditControl is unknown 
    //... 
} 

换句话说:我应该怎么做,从非成员函数访问m_bEditControl(或任何其他对话框的成员)?

回答

5

如果你想保持GUI从逻辑分离,那么你可以让你的对话框类非常薄,基本上只是识别发生的事件(onBtnSomethingClickonPaintonCancel等),创建一个类,将负责用于处理这些事件一旦发生。

最简单的可能的解决方案是通过引用传递你的对话框给它的构造来构建这种类:

class MyClass 
{ 
public: 
    MyClass(MainDlg& dlg) : dlg_(dlg) { } 

private: 
    MainDlg& dlg_; 
}; 

而且对话框类可以实例化类的对象:

class MainDlg : public CDialog 
{ 
public: 
    BOOL MainDlg::OnInitDialog() 
    { 
     //... 
     myClass_ = new MyClass(*this); 
     return TRUE; 
    } 
    ~MainDlg() 
    { 
     //... 
     delete myClass_; 
    } 

private: 
    MyClass* myClass_; 
}; 

只是不要“传播”任何进一步的GUI类的引用。如果您需要直接访问对话框的某些成员,那么您可能会考虑重新设计代码 - 例如,如果您正在编写创建新User的方法,并且您正在考虑访问对话框的某个文本字段,那么它似乎是更好的主意,从对话成员“收集”输入,并将其从对话类中独立地传递给这种函数。


您的问题:如果你有需要使用对话框的CEdit成员的辅助非成员函数,那么您可以在成员函数调用时,它改变void nonMember()void nonMember(CEdit& m_bEditControl)和引用传递给这个会员:nonMember(m_bEditControl);但请注意,这种方法是错误的。

换句话说:这似乎是一个糟糕的设计

void nonMember(CEdit& m_bEditControl) 
{ 
    CString text = L"something"; 
    m_bEditControl.SetWindowTextW(text.GetBuffer()); 
} 

void MainDlg::someMethod() 
{ 
    nonMember(m_bEditControl); 
} 

,这似乎要好得多:

CString nonMember2() 
{ 
    return L"something"; 
} 

void MainDlg::someMethod() 
{ 
    CString str = nonMember2(); 
    m_bEditControl.SetWindowTextW(str.GetBuffer()); 
} 

希望这有助于:)