C++ 拦截来自MFC子级的子级的消息
我有一个CListCtrl类,当用户选择其中一个子项时,我会在子项上显示一个cmbobox,用户可以从中进行选择 但是我有一个问题。当用户做出选择时,我需要组合框消失(即intercept CBN_SELCHANGE)。问题是我需要使cmbobox成为CListCtrl的子对象(否则,即使我将组合框设置为最顶端,列表在组合框上方绘制时也会遇到奇怪的问题)。因此CBN_SELCHANGE消息被发送到列表视图,可以理解,该视图会忽略它。如何让列表视图将该消息传递到父窗口 我真的需要派生自己的CListCtrl类来截取CBN_SELCHANGE消息并将其传递给父窗口吗?有没有比创建OnWndMsg处理程序更好的方法 谢谢你的帮助 编辑:此代码有效C++ 拦截来自MFC子级的子级的消息,c++,mfc,clistctrl,ccombobox,C++,Mfc,Clistctrl,Ccombobox,我有一个CListCtrl类,当用户选择其中一个子项时,我会在子项上显示一个cmbobox,用户可以从中进行选择 但是我有一个问题。当用户做出选择时,我需要组合框消失(即intercept CBN_SELCHANGE)。问题是我需要使cmbobox成为CListCtrl的子对象(否则,即使我将组合框设置为最顶端,列表在组合框上方绘制时也会遇到奇怪的问题)。因此CBN_SELCHANGE消息被发送到列表视图,可以理解,该视图会忽略它。如何让列表视图将该消息传递到父窗口 我真的需要派生自己的CLis
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()
{
};
};
但我真的很想知道是否有更好的方法来做到这一点。您可以将cmbobox子类化,以便它能够处理CBN\U特写消息。 您的自定义组合将了解管理器,即首先创建它的对象,并将在关闭时销毁它(顶级窗口或其他,应作为自定义组合框构造函数的参数提供)。。。 因此,当您在列表项顶部创建combobox时,您将创建此自定义combobox的实例,而不是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);
}
}
您可以将CComboBox子类化,使其能够处理CBN_特写消息。 您的自定义组合将了解管理器,即首先创建它的对象,并将在关闭时销毁它(顶级窗口或其他,应作为自定义组合框构造函数的参数提供)。。。 因此,当您在列表项顶部创建combobox时,您将创建此自定义combobox的实例,而不是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);
}
}
虽然这是一个不错的建议,但我最终还是创建了一个自定义类,它在特定情况之外几乎没有用处。此外,当你说子类窗口,我认为你不是说使用子类窗口函数?我在想,如果我能截获消息,是否可以使用窗口的真正子类。遗憾的是,我从来没有让窗口子类化工作过(没有子类化,我的意思只是:-):类CNotifyingComboBox:public cmboboxso唉,我还是回到了原点,即创建一个只在这些特定情况下使用的类。也就是说,你的组合框的优点是我可以覆盖绘图并将其放入列表视图子项:)TBH我正在使用我在OP中放入的方案,但无论如何我都会接受这篇文章:)虽然这不是一个坏建议,但我最终还是创建了一个自定义类,在特定情况之外几乎没有用处。此外,当你说子类窗口,我认为你不是说使用子类窗口函数?我在想,如果我能截获消息,是否可以使用窗口的真正子类。遗憾的是,我从来没有让窗口子类化工作过(没有子类化,我的意思只是:-):类CNotifyingComboBox:public cmboboxso唉,我还是回到了原点,即创建一个只在这些特定情况下使用的类。也就是说,您的组合框的优点是我可以覆盖图形并将其放入列表视图子项:)TBH我正在使用我在OP中输入的方案,但无论如何我都会接受此帖子:)