gpt4 book ai didi

c++ - 使用 MFC 拦截来自 child 的 child 的消息

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:09 24 4
gpt4 key购买 nike

我有一个 CListCtrl 类,当用户选择其中一个子项时,我会在该子项上显示一个 CComboBox,然后用户可以从中进行选择。

但是我有一个问题。当用户做出选择时,我需要组合框消失(即拦截 CBN_SELCHANGE)。问题是我需要使 CComboBox 成为 CListCtrl 的子项(否则,即使我将组合框设置为最顶层,我也会在组合框上绘制列表时遇到奇怪的问题)。所以 CBN_SELCHANGE 消息被发送到 ListView ,可以理解,它会忽略它。我怎样才能让 ListView 将该消息传递到父窗口。

我真的需要派生我自己的 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 消息。您的自定义 Combo 将了解管理器,即首先创建它的对象,并且必须在关闭时销毁它(顶级窗口或其他任何东西,应作为参数提供给您的自定义组合框构造函数)...因此,当您在列表项的顶部创建组合框时,您将创建此自定义组合框的实例,而不是 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);
}
}

关于c++ - 使用 MFC 拦截来自 child 的 child 的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1709093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com