GUI をロジックから分離したい場合は、基本的に発生するイベント ( onBtnSomethingClick
、onPaint
、onCancel
など) を認識するためだけに、ダイアログ クラスを非常に薄く保ち、発生したイベントを処理するクラスを作成します。
最も簡単な解決策の 1 つは、コンストラクタへの参照によってダイアログを渡すことによって、この種のクラスを構築することです。
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());
}
お役に立てれば :)