Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何将消息路由到控件';s标准WNDPROC_Windows_Winapi_Mfc_Message_Wndproc - Fatal编程技术网

Windows 如何将消息路由到控件';s标准WNDPROC

Windows 如何将消息路由到控件';s标准WNDPROC,windows,winapi,mfc,message,wndproc,Windows,Winapi,Mfc,Message,Wndproc,创建标准窗口控件(例如“编辑”控件)时,其WNDPROC被定义为窗口类的一部分(即“编辑”具有特定的WNDPROC,用于使窗口显示并作为编辑控件) MFC允许您通过它们的包装类与这些控件交互,例如CEdit包装“编辑”窗口控件的专用消息 MFC进一步允许您将一个实例的代码> >“编辑”< /C>窗口绑定到CEDIT的C++子类,比如“代码> CyMeDe> ,在这里您可以重写 CEDIT < /C> >和 CWnd < /C> >的继承虚拟函数,并且可以定义一个消息表来获得发送到窗口实例本身的

创建标准窗口控件(例如
“编辑”
控件)时,其
WNDPROC
被定义为窗口类的一部分(即
“编辑”
具有特定的
WNDPROC
,用于使窗口显示并作为编辑控件)

MFC允许您通过它们的包装类与这些控件交互,例如
CEdit
包装
“编辑”
窗口控件的专用消息

MFC进一步允许您将一个实例的代码> >“编辑”< /C>窗口绑定到CEDIT的C++子类,比如“代码> CyMeDe> <代码>,在这里您可以重写<代码> CEDIT < /C> >和<代码> CWnd < /C> >的继承虚拟函数,并且可以定义一个消息表来获得发送到窗口实例本身的访问/重写消息。 有,它使用当前消息参数调用此->DefWndProc。这似乎是为了查找与其关联的HWND的

WNDPROC
。那么,这是正确的答案吗:调用DefWndProc()(或者同样地调用Default()),这将把它交给windows控件的
WNDPROC

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

如果我定义了一个任意的消息处理程序,比如WM_SETTEXT,那么将此消息传递给
编辑“
WNDPROC

我还想知道是否有办法将消息传递到超类(C++类层次结构)进行处理?许多OnXXX样式的处理程序都有这样做的方法,但是有一种机制可以用于ON_消息处理程序吗

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子类-< /P> 因此C继承B继承A,其中A是MFC类(例如,

CEdit

其中每一个都可以有一个MFC消息表,即
BEGIN\u message\u MAP
END_MESSAGE_MAP
,每个都可以有一个处理任意windows消息的处理程序,例如
WM_MESSAGE(WM_SETTEXT,OnSetText)
,而
OnSetText
成员不一定是虚拟的,只是一个静态成员(每个MFC子类都可以以任意方式路由该消息)

我的问题是-既然
WM_MESSAGE
dispatch条目没有返回值,我如何允许MFC在返回到真正的windows“EDIT”类的wndproc之前,从C到B遍历MFC调度表到a


或者,是否所有这些条目都是在MFC设计级别上设计的,而不是被浏览?i、 e.最子类层的调度程序是唯一一个调用的调度程序?如果它想利用一个继承的成员,它必须手动进行调用——MFC根本没有任何特定的通用结构。CWnd::DefWindowProc()使用子类化的WINDOWPROC,并将调用编辑窗口的窗口过程。

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

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


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

在这个特定实例中,他调用
Default()
会有什么不同?查看wincore.cpp,在我的示例中,Default和DefWindowProc()是相同的,因为我将与Default()相同的参数传递给DefWindowProc(),并且Default调用DefWindowProc()所以结果完全相同。我更不清楚ON_消息是消息接收器还是其他ON_WM_xxx上的消息接收器之间的区别,后者有一个BOOL结果来指示您的处理程序是否处理了消息,或者它是否应该向消息表链上传播。或者,对于我的示例,我们甚至可以如何实现这一点(例如,如果我的子类想要建立消息处理程序链-如何?)。并验证我的示例调用了MFC的WNDPROC子类化(挂钩)之前的WNDPROC。我不确定是否理解您的问题。在一个线程中,只能通过MFC对窗口进行一次子类化。因此,当消息进入子类窗口时,它会尝试查找MFC消息处理程序。如果它找到一个,它就会调用它。如果找不到,它将调用默认窗口过程,MFC是从该窗口过程生成子类的。一般来说,如果你想对MFC链进行一次修改,你可以直接调用BaseClass——CSomeBaseClass::OnSetText(WPARAM,lPARAM)。你可以在C++级别上有多个MFC子类,所以C继承B继承A,其中A是MFC类(例如,代码> CEDIT < /Cl>)。其中每一个都可以有一个MFC消息表,即
BEGIN\u message\u MAP
END\u MESSAGE\u MAP
每个都可以有一个
WM\u MESSAGE(WM\u SETTEXT)
的处理程序,我的问题是-因为
WM\u MESSAGE
没有返回值,在返回“编辑”窗口类的wndproc之前,我如何允许MFC从C到B到A遍历MFC调度表?在这个问题中,我们需要@RaymondChen。或者@Joseph M.newmerat抽象/一般级别,yes Default()将执行“正常”操作。这听起来似乎意味着将调用MFC钩住的WNDPROC,而不是调用::DefWindowProc(我们希望调用窗口类“EDIT”的WNDPROC,而不是全局通用默认窗口过程!)