MFCと子の子からのメッセージをインターセプト
質問
私はCListCtrlのクラスがあり、現時点では、ユーザーは、私は、ユーザーが、その後から選択できるサブアイテムの上に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()
{
};
};
しかし、私は実際にこれを行うためのよりよい方法があるかどうかを知りたいと思います。
解決
あなたはそれがCBN_CLOSEUPメッセージを処理するようCComboBoxのサブクラスを作成することができます。 カスタムコンボは、すなわち、最初の場所でそれを作成してクローズアップ(トップレベルウィンドウまたは何、カスタムコンボボックスのコンストラクタに引数として提供されるべきである)時にそれを破壊する必要がありますオブジェクトマネージャについて知っているだろう... あなたがリストアイテムの上にコンボボックスを作成するときに、あなたは、このカスタマイズされたコンボボックスの代わりに、MFCの既定の1のインスタンスを作成します。 コンボボックスのイベントハンドラは、そのようになります:
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);
}
}