在非成员函数中访问MFC对话框的成员变量

时间:2013-02-14 15:58:42

标签: c++ visual-c++ object mfc scope

我正在使用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(或任何其他对话框的成员)?

1 个答案:

答案 0 :(得分: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());
}

希望这会有所帮助:)