我有一个带有富文本控件的对话框。该对话框想拦截控件上的右键单击事件;在某些情况下,对话框应该执行自己的功能并阻止消息到达控件,在其他情况下,它应该让控件接收消息。
所以我有:
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的用途。这不是真的吗?如果是这样我怎么做到这一点?
答案 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仍在通过......