如果你想保持GUI从逻辑分离,那么你可以让你的对话框类非常薄,基本上只是识别发生的事件(onBtnSomethingClick
,onPaint
,onCancel
等),创建一个类,将负责用于处理这些事件一旦发生。
最简单的可能的解决方案是通过引用传递你的对话框给它的构造来构建这种类:
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());
}
希望这有助于:)