如果你想保持 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 类的引用。如果您需要直接访问对话框的某些成员,那么您可能会考虑重新设计您的代码 - 例如,如果您正在编写创建 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());
}
希望这可以帮助 :)