当一个标准的窗口控件(例如一个"EDIT"
控件)被创建时,它WNDPROC
被定义为窗口类的一部分(即"EDIT"
有一个WNDPROC
被设计用来使窗口显示和表现得像一个编辑控件的特性)。
MFC 允许您通过它们的包装类与此类控件进行交互,例如包装窗口控件CEdit
的专用消息。"EDIT"
MFC 进一步允许您将"EDIT"
窗口实例绑定到 CEdit 的 C++ 子类,例如 a CMyEdit
,您可以在其中覆盖继承的 and 虚函数CEdit
,CWnd
并且您可以定义消息表以获取访问/覆盖发送到窗口实例本身的消息.
有CWnd::Default(),它使用当前消息参数调用 this->DefWndProc。这似乎是在查找WNDPROC
与之关联的 HWND。那么这是正确的答案吗:调用 DefWndProc()(或同样的 Default()),它将把它交给WNDPROC
windows 控件?
显然,这与其他消息表处理程序不同,后者可以返回 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 根本没有任何特定的通用结构吗?