1

CListCtrl クラスがあり、ユーザーがサブ項目の 1 つを選択すると、そのサブ項目の上に CComboBox が表示され、ユーザーはそこから選択できます。

しかし、私には問題があります。ユーザーが選択を行ったら、コンボ ボックスを非表示にする必要があります (つまり、CBN_SELCHANGE をインターセプトします)。問題は、CComboBox を CListCtrl の子にする必要があることです (そうしないと、コンボ ボックスを一番上に設定しても、リストがコンボ ボックスの上に描画されるという奇妙な問題が発生します)。そのため、CBN_SELCHANGE メッセージがリスト ビューに送信され、当然のことながら、それは無視されます。リストビューでそのメッセージを親ウィンドウに渡すにはどうすればよいですか。

CBN_SELCHANGE メッセージを傍受して親ウィンドウに渡すだけの独自の CListCtrl クラスを本当に派生させる必要があるのでしょうか? OnWndMsg ハンドラーを作成するよりも良い方法はありますか?

助けてくれてありがとう!

編集:このコードは機能します

class CPassThroughListCtrl : public CListCtrl
{
protected:
    virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
        if ( message == WM_COMMAND )
        {
            GetParent()->SendMessage( message, wParam, lParam );
        }
        return CListCtrl::OnWndMsg( message, wParam, lParam, pResult );
    }
public:
    CPassThroughListCtrl()
    {
    };
};

しかし、これを行うためのより良い方法があれば本当に知りたいです。

4

1 に答える 1

1

CBN_CLOSEUP メッセージを処理するように、CComboBox をサブクラス化できます。カスタムコンボはマネージャー、つまり最初にそれを作成したオブジェクトを認識し、クローズアップ時にそれを破棄する必要があります(トップレベルウィンドウなど、カスタムコンボボックスコンストラクターへの引数として提供する必要があります)...リスト項目の一番上にコンボボックスを作成すると、MFC の既定のコンボボックスではなく、このカスタマイズされたコンボボックスのインスタンスが作成されます。Combobox イベント ハンドラーは次のようになります。

BEGIN_MESSAGE_MAP(CNotifyingComboBox, CComboBox)
 ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseUp)
END_MESSAGE_MAP()

void CNotifyingComboBox::OnCloseUp()
{
    // _manager is pointer to the object that created this combobox, 
    // and is responsible for its destruction, 
    // should be passed into CNotifyingComboBox cosntructor
    if( NULL != _manager )
    {
        _manager->OnCloseUpComboBox(this);
    }
}
于 2009-11-12T20:28:41.357 に答える