wm_rbuttondown和wm_contextmenu的执行 wm_rbuttondownwm_contextmenu这个2个消息是怎么回事, 怎么不响应,别粘贴网上的东西,希望亲自做过实验回复我,多谢。我试过了, 有时候只有一个ie消息相应, 另一个不响应。这是怎么回事 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不需要,你新建一个单文档工程,然后再CMainFrame里 添加 2个函数:OnContextMenuOnRbuttonDown然后 右键 就可以验证问题了void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point){ // TODO: 在此处添加消息处理程序代码 char buf[100]={0}; sprintf(buf,"OnContextMenu\r\n"); if(g_File.m_hFile!=INVALID_HANDLE_VALUE) { g_File.Write(buf,strlen(buf)); } }void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 char buf[100]={0}; sprintf(buf,"OnRButtonDown"); if(g_File.m_hFile!=INVALID_HANDLE_VALUE) { g_File.Write(buf,strlen(buf)); } CFrameWnd::OnRButtonDown(nFlags, point);}这是我的测试代码 日志里记录OnContextMenu ,说明只有这个函数被执行!!但是我再其他项目中发现 ,OnRButtonDown也会被相应,怎么回事? http://bbs.csdn.net/topics/10322443 你看吧:void CsssView::OnRButtonDown(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CView::OnRButtonDown(nFlags, point);}void CsssView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/){ // TODO: 在此处添加消息处理程序代码 AfxMessageBox(_T("OnContextMenu"));}结果 oncontextmenu不会响应了,怎么回事?我已经把 cmainframe里的 相应宏注释掉了 http://blog.csdn.net/shuilan0066/article/details/7678747 因此,若程序还响应了鼠标右键按下的消息OnRButtonDown,且在此响应函数中有模特对话框出现的话,则不会响应WM_CONTEXTMENU消息。亲,你看我的,有模式对话框?没有。你的文章,我昨天就看过了虽然没有解决问题,依然感谢你 不要用“AfxMessageBox(_T("OnContextMenu"));”使用 afxDump << "OnContextMenu" << "\n";AfxMessageBox 改变了 鼠标 点击。 多谢,修改测试结果:1. 2个消息相应函数均在view中的话,那么都执行。代码为:void CsssView::OnRButtonDown(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 afxDump<<_T("OnRButtonDown\r\n"); CView::OnRButtonDown(nFlags, point);}void CsssView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/){ // TODO: 在此处添加消息处理程序代码 afxDump<<_T("OnContextMenu\r\n");}2. 如果两个都放在 mainframe里, 发现wm_rbuttondown不会响应。可能被view拦截了。结论:对于从sdk一路过来的人很迷惑, 有的消息不是你有响应代码了,就会运行, 可能会被其他窗口给拦截了。具体拦截原因,可能与mfc的设计有关在做实验1的时候, 两个消息均放在view中处理, 用afxDump来打印,发现一个奇怪的问题OnRButtonDownOnContextMenu注意一共有3行,第2行是空白行 ,为什么会有第2行的产生呢?按照windows的规定, '\r\n'所做的仅仅是换行, 所以按理来推论: 不应该有3行,只有有2行,仅此而已。 “2. 如果两个都放在 mainframe里, 发现wm_rbuttondown不会响应。”是有这个问题。3. 如果两个都放在 view 里, 2个 都会执行。 OnRButtonDownOnContextMenu这里如何解释呢? 第二行是空白行, 按照windows的规定, '\r\n'所做的仅仅是换行, 所以按理来推论: 不应该有3行,只有2行,仅此而已。 可是afxdump的结果是3行,很是不解。 afxDump<<_T("OnRButtonDown\r\n");不需要用 \r\n只要 \n 就够了。\r 被 当 成 \n 了mainframe 通常 是 被 view 覆盖了, 所以 只是 在 toolbar 附近 可以 OnContextMenu 这个结论不对吧, 你试试右键点击view区域, CMainfram也会收到wm_contextmenu的。(前提是: 当framewnd来拦截 wm_contextmenu)可以结贴了,多谢 你 view里 没有 就会“CMainfram收到wm_contextmenu的”直接 让 CMainfram 收到 wm_contextmenu ,要在 工具条 附近 R点击! 直接 让 CMainfram 收到 wm_contextmenu ,要在 工具条 附近 R点击我的win7, vs2008做的实验, 并不需要在你说的那个地方点击, 很多只要在客户区域就可以了。你的可能是老系统吧 vc6 xp道理上 如果 view 里 响应,那么 mainframe 里 就不需要响应,这是 消息 的 传递路径。 win7 改了 ? 给word 添加文本框后,怎么使焦点重新回到文档上,而不是在文本框或文本框内 小问题,CEdit tooltip 使用ChangeDisplaySettingsEx改变分辨率时报错。。。。 程序运行后出现Query the registry to get manually configured process list. CopyFile问题 在哪释放new内存 关于字符串的问题? 关于VFW的视频捕捉 万分火急,MDI中如何使产生的子窗口出现在所有子窗口的顶端。 如何通过继承cedit类改变控件最大长度? 从FTP服务器上批量下载小文件的问题 msdn搞毛啊
不需要,你新建一个单文档工程,然后再CMainFrame里 添加 2个函数:OnContextMenuOnRbuttonDown然后 右键 就可以验证问题了void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: 在此处添加消息处理程序代码
char buf[100]={0};
sprintf(buf,"OnContextMenu\r\n");
if(g_File.m_hFile!=INVALID_HANDLE_VALUE)
{
g_File.Write(buf,strlen(buf));
}
}void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 char buf[100]={0};
sprintf(buf,"OnRButtonDown");
if(g_File.m_hFile!=INVALID_HANDLE_VALUE)
{
g_File.Write(buf,strlen(buf));
} CFrameWnd::OnRButtonDown(nFlags, point);
}这是我的测试代码 日志里记录OnContextMenu ,说明只有这个函数被执行!!
但是我再其他项目中发现 ,OnRButtonDown也会被相应,怎么回事?
你看吧:
void CsssView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 CView::OnRButtonDown(nFlags, point);
}void CsssView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/)
{
// TODO: 在此处添加消息处理程序代码
AfxMessageBox(_T("OnContextMenu"));
}
结果 oncontextmenu不会响应了,怎么回事?我已经把 cmainframe里的 相应宏注释掉了
因此,若程序还响应了鼠标右键按下的消息OnRButtonDown,且在此响应函数中有模特对话框出现的话,则不会响应WM_CONTEXTMENU消息。亲,你看我的,有模式对话框?没有。你的文章,我昨天就看过了
虽然没有解决问题,依然感谢你
使用 afxDump << "OnContextMenu" << "\n";
AfxMessageBox 改变了 鼠标 点击。
多谢,修改测试结果:1. 2个消息相应函数均在view中的话,那么都执行。代码为:void CsssView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 afxDump<<_T("OnRButtonDown\r\n");
CView::OnRButtonDown(nFlags, point);
}void CsssView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/)
{
// TODO: 在此处添加消息处理程序代码
afxDump<<_T("OnContextMenu\r\n");
}2. 如果两个都放在 mainframe里, 发现wm_rbuttondown不会响应。可能被view拦截了。
结论:对于从sdk一路过来的人很迷惑, 有的消息不是你有响应代码了,就会运行, 可能会被其他窗口给拦截了。具体拦截原因,可能与mfc的设计有关
在做实验1的时候, 两个消息均放在view中处理, 用afxDump来打印,发现一个奇怪的问题
OnRButtonDownOnContextMenu注意一共有3行,第2行是空白行 ,为什么会有第2行的产生呢?按照windows的规定, '\r\n'所做的仅仅是换行, 所以按理来推论: 不应该有3行,只有有2行,仅此而已。
是有这个问题。
3. 如果两个都放在 view 里, 2个 都会执行。
这里如何解释呢? 第二行是空白行, 按照windows的规定, '\r\n'所做的仅仅是换行, 所以按理来推论: 不应该有3行,只有2行,仅此而已。 可是afxdump的结果是3行,很是不解。
不需要用 \r\n
只要 \n 就够了。
\r 被 当 成 \n 了mainframe 通常 是 被 view 覆盖了,
所以 只是 在 toolbar 附近 可以 OnContextMenu
这个结论不对吧, 你试试右键点击view区域, CMainfram也会收到wm_contextmenu的。(前提是: 当framewnd来拦截 wm_contextmenu)
可以结贴了,多谢
直接 让 CMainfram 收到 wm_contextmenu ,要在 工具条 附近 R点击!
道理上 如果 view 里 响应,那么 mainframe 里 就不需要响应,这是 消息 的 传递路径。
win7 改了 ?