1

我正在处理 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

4

1 回答 1

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 类的引用。如果您需要直接访问对话框的某些成员,那么您可能会考虑重新设计您的代码 - 例如,如果您正在编写创建 newUser的方法并且您正在考虑访问对话框的某些文本字段,那么它似乎很多更好的主意,从对话框成员“收集”输入,并将其独立于对话框类传递给这种函数。


对于您的问题:如果您有一个需要使用对话框成员的辅助非成员函数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());
}

希望这可以帮助 :)

于 2013-02-14T16:47:57.750 回答