2013-02-14 48 views
1

我正在處理MFC對話框,我不確定如何從非成員訪問對象的成員變量(編輯控件,按鈕,複選框等)功能。在非成員函數中訪問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(或任何其他對話框的成員)?

回答

5

如果你想保持GUI從邏輯分離,那麼你可以讓你的對話框類非常薄,基本上只是識別發生的事件(onBtnSomethingClickonPaintonCancel等),創建一個類,將負責用於處理這些事件一旦發生。

最簡單的可能的解決方案是通過引用傳遞你的對話框給它的構造來構建這種類:

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()); 
} 

希望這有助於:)