我有一个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()
{
};
};
但我真的很想知道是否有更好的方法来做到这一点。
答案 0 :(得分:1)
您可以将CComboBox子类化,以便它将处理CBN_CLOSEUP消息。 你的自定义组合将知道管理器,即首先创建它的对象,并且必须在关闭时销毁它(顶级窗口或其他任何东西,应作为自定义组合框构造函数的参数提供)... 因此,当您在列表项的顶部创建组合框时,您将创建此自定义组合框的实例,而不是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);
}
}