题
我有一个CListCtrl类和此刻,当用户选择我显示在一个子项目CComboBox其中用户可以然后使从选择的子项中的一个。
但是我有一个问题。当用户已经做出选择我需要组合框消失(即截距CBN_SELCHANGE)。问题是,我需要做的CComboBox的CListCtrl中的孩子(否则我得到的名单拉过,即使我设置了组合框是最上面的组合框怪异问题)。所以CBN_SELCHANGE消息被发送到列表视图,可以理解,忽略它。我怎样才能获得列表视图来传递消息到父窗口。
我真的需要得到我自己的CListCtrl类,仅截获CBN_SELCHANGE消息,并将其传递到父窗口?有没有更好的办法做到这一点比创建的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()
{
};
};
但我很想知道是否有这样做一个更好的方式。
解决方案
您可以继承CComboBox使得它将处理CBN_CLOSEUP消息。 您的自定义组合将了解的经理,即创建它摆在首位,并会在近距离(顶层窗口或什么的,应提供作为参数传递给您的自定义组合框的构造函数)来破坏它的对象... 所以,当你在列表项的顶部创建组合框,您将创建此自定义组合框,而不是MFC默认一个实例。 组合框事件处理程序可能看起来像:
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);
}
}
不隶属于 StackOverflow