gpt4 book ai didi

windows - 如何将消息路由到控件的标准 WNDPROC

转载 作者:可可西里 更新时间:2023-11-01 14:51:03 28 4
gpt4 key购买 nike

创建标准窗口控件(例如 "EDIT" 控件)时,其 WNDPROC 被定义为窗口类的一部分(即 "EDIT " 有一个特定的 WNDPROC,旨在使窗口显示并充当编辑控件。

MFC 允许您通过它们的包装类与此类控件进行交互,例如 CEdit 包装了 "EDIT" 窗口控件的专用消息。

MFC 进一步允许您将 "EDIT" 窗口的实例绑定(bind)到 CEdit 的 C++ 子类,例如 CMyEdit,您可以在其中覆盖继承的虚函数CEditCWnd,您可以定义一个消息表来访问/覆盖发送到窗口实例本身的消息。

CWnd::Default() ,它使用当前消息参数调用 this->DefWndProc。这似乎是在 WNDPROC 中查找与之关联的 HWND。那么这是正确的答案吗:调用 DefWndProc()(或者同样地,Default()),它将把它传递给 Windows 控件的 WNDPROC

显然,这与其他消息表处理程序不同,后者可以返回 FALSE 以指示它们没有处理该消息,并且 MFC 会自动将消息沿类继承层次结构向上路由到该消息的下一个消息处理程序,或者,我假设,Default() 将由 native WNDPROC 处理?

如果我定义一个任意的消息处理程序,例如 WM_SETTEXT,那么将此消息传递给 "EDIT" WNDPROC 的正确方法是什么?

我也很想知道是否有办法将消息传递给父类(super class)(C++ 类层次结构)进行处理?许多 OnXXX 样式的处理程序确实有办法这样做,但是是否有适用于 ON_MESSAGE 处理程序的机制?

class CDynamicMenuControlEdit : public CEdit  
{
...
LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
...
}

BEGIN_MESSAGE_MAP(CDynamicMenuControlEdit, CEdit)
...
ON_MESSAGE(WM_SETTEXT, OnSetText)
...
END_MESSAGE_MAP()

LRESULT CDynamicMenuControlEdit::OnSetText(
WPARAM wParam, // not used; must be zero
LPARAM lParam // window-text string (LPCTSTR)
)
{
if (m_bHasFocus)
{
// do normal thing
// !!! THIS IS MY QUESTION: IS THIS CALLING EDIT's WNDPROC, or ::DefWinProc()? !!!
return DefWindowProc(WM_SETTEXT, wParam, lParam);
}
...
}

澄清

您可以在 C++ 级别拥有多个 MFC 子类 -

因此 C 继承 B 继承 A,其中 A 是 MFC 类(例如 CEdit)。

它们中的每一个都可以有一个 MFC 消息表 - 即 BEGIN_MESSAGE_MAP ... END_MESSAGE_MAP 每个都可以有一个处理任意窗口消息的处理程序,例如 WM_MESSAGE(WM_SETTEXT, OnSetText) - OnSetText 成员不一定是虚拟的 - 只是一个静态成员(每个 MFC 子类都可以以任意方式路由该消息)。

我的问题是 - 因为 WM_MESSAGE 调度条目没有返回值,我如何允许 MFC 在返回给真正的 Windows 'EDIT' 类的 wndproc?

或者是否所有此类条目都旨在 MFC 设计级别不被遍历?即,子类化程度最高的层的调度程序是唯一被调用的?如果它想利用一个继承的成员,它必须手动进行调用 - MFC 根本没有为此提供任何特定的通用结构?

最佳答案

调用 Default() 将导致响应消息时发生的“正常”处理。我不完全清楚你想要实现什么,但在我看来调用 Default() 是你想要做的。

如果您在 CWnd 处理程序中查看大量来自 Windows 消息的处理程序(以及从 CWnd 派生的类的处理程序,例如 CEdit) 你会看到他们调用了 Default()

明智的话,Default() 实际上会使用原始消息具有的任何参数 - 您无法更改它们。

关于windows - 如何将消息路由到控件的标准 WNDPROC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15252435/

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