如果你想保持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());
}
希望這有助於:)