EN_MSG FILTER,无法阻止消息传播

时间:2010-01-21 10:44:07

标签: mfc

我有一个带有富文本控件的对话框。该对话框想拦截控件上的右键单击事件;在某些情况下,对话框应该执行自己的功能并阻止消息到达控件,在其他情况下,它应该让控件接收消息。

所以我有:

ON_NOTIFY(EN_MSGFILTER, IDC_RICHTEXT, OnRichTextMsgfilter)

void CMyDialog::OnRichTextMsgfilter(NMHDR *pNMHDR, LRESULT *pResult)
{
    MSGFILTER *pMsgFilter = reinterpret_cast<MSGFILTER *>(pNMHDR);
    *pResult = 0;
    if (pMsgFilter->msg == WM_RBUTTONUP)
    {
        if(...)
         *pResult=1;
    }
}

我逐步执行代码并设置pResult,但控件仍然会收到消息。看MSDN它说:

  

如果控件应该处理   事件,消息返回零   值。如果控件应该忽略   事件,消息返回一个   非零值。

但定义的消息处理程序签名没有返回...我假设这是* pResult的用途。这不是真的吗?如果是这样我怎么做到这一点?

2 个答案:

答案 0 :(得分:1)

所以我试图在一个简单的基于对话框的应用程序中重现这种行为,我真的不能 - 但是,我不确定拦截正确的按钮消息试图解决的是什么。

这就是说下面的代码在我的测试中完全阻止鼠标左键单击(如果这返回TRUE,则控件不响应左键单击 - 但是焦点将在初始点击时设置为控件,这更像是窗口管理器问题而不是控件本身)

void CTestDlg::OnMsgfilterRichedit1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    MSGFILTER *pMsgFilter = reinterpret_cast<MSGFILTER *>(pNMHDR);

    if (pMsgFilter->msg == WM_LBUTTONUP || pMsgFilter->msg == WM_LBUTTONDOWN)
    {
        *pResult = TRUE;
        return;
    }

    *pResult = FALSE;
}

如果我将* pResult = TRUE更改为* pResult = FALSE,则左键单击再次开始工作。

可能你想捕捉并过滤掉WM_RBUTTONDOWN而不是WM_RBUTTONUP来做你想要的事情,但由于我不确定你试图过滤掉哪些功能我无法肯定地说。

答案 1 :(得分:0)

WM_LBUTTONDOWN仍在通过......