1

MFC ダイアログで作業していますが、非メンバー関数からオブジェクトのメンバー変数 (編集コントロール、ボタン、チェック ボックスなど) にアクセスする方法がわかりません。

オブジェクトはwhatever .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

4

1 に答える 1

5

GUI をロジックから分離したい場合は、基本的に発生するイベント ( onBtnSomethingClickonPaintonCancelなど) を認識するためだけに、ダイアログ クラスを非常に薄く保ち、発生したイベントを処理するクラスを作成します。

最も簡単な解決策の 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());
}

お役に立てれば :)

于 2013-02-14T16:47:57.750 に答える