簡體   English   中英

在非成員函數中訪問MFC對話框的成員變量

[英]Accessing member variables of MFC dialog in non-member function

我正在MFC對話框上工作,我不確定如何從非成員函數訪問對象的成員變量(編輯控件,按鈕,復選框等)。

由於對象是在任何 .cpp中創建的,並且所有對象事件都在whatDlg.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 (或任何其他對話框的成員)?

如果你想保持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());
}

希望這可以幫助 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM