4

当一个标准的窗口控件(例如一个"EDIT"控件)被创建时,它WNDPROC被定义为窗口类的一部分(即"EDIT"有一个WNDPROC被设计用来使窗口显示和表现得像一个编辑控件的特性)。

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

MFC 进一步允许您将"EDIT"窗口实例绑定到 CEdit 的 C++ 子类,例如 a CMyEdit,您可以在其中覆盖继承的 and 虚函数CEditCWnd并且您可以定义消息表以获取访问/覆盖发送到窗口实例本身的消息.

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

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

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

我也很想知道是否有办法将消息传递给超类(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每个都可以有一个用于任何任意 Windows 消息的处理程序,例如WM_MESSAGE(WM_SETTEXT, OnSetText)- 并且该OnSetText成员不一定是虚拟的 - 只是一个静态成员(每个 MFC 子类都可以将该消息路由到任何任意方式)。

我的问题是 - 由于WM_MESSAGE调度条目没有返回值,我如何允许 MFC 在将 MFC 调度表从 C 传送到 B 到 A 之前将其返回给真正的 Windows 'EDIT' 类的 wndproc?

还是所有这些条目都打算在 MFC 设计级别不被遍历?即最子类化层的调度程序是唯一被调用的?如果它想利用继承的成员,它必须手动进行调用——MFC 根本没有任何特定的通用结构吗?

4

2 回答 2

4

调用Default()将导致响应消息发生的“正常”处理。我并不完全清楚你想要达到的目标,但在我看来,打电话Default()就是你想要做的。

如果您查看处理程序中 Windows 消息中的许多CWnd处理程序(以及派生自CWnd诸如的类的处理程序CEdit),您将看到它们调用Default().

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

于 2013-03-06T17:23:19.967 回答
2

你做对了。CWnd::DefWindowProc() 使用您从中继承的 WINDOWPROC,并将调用 EDIT 窗口的窗口过程。

于 2013-03-06T17:22:16.743 回答