我正在使用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
(或任何其他对话框的成员)?
答案 0 :(得分:5)
如果您希望将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());
}
希望这会有所帮助:)