导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

实现PreTranslateMessage,导致鼠标OnLButtonUp不响应

yuanye2005king 中石油 技术经理  2009-07-27 09:49:57
tag:我实现了PreTranslateMessage(),在函数里面加入如下代码:
BOOL CPathCtrl::PreTranslateMessage(MSG* pMsg) 
{
// 设置控件拖动
if (pMsg->message==WM_LBUTTONDOWN)
{
FromHandle(pMsg->hwnd)->PostMessage(WM_SYSCOMMAND,SC_MOVE+1,0);
}
return CWnd::PreTranslateMessage(pMsg);
}

加入如下代码导致鼠标OnLButtonUp不响应,我在OnLButtonUp加入MessageBox,没有弹出消息框,做测试中怎么解决?这段代码是什么意思?我也不太理解!希望解释下,谢谢。

search result:在网上Google下,没有找到相关的解决方案。在QQ群里也问了,没有很好的解决,希望大家给我提供个解决方案,在一次谢谢大家了
...全文
354 点赞 收藏 15
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ghost90 2009-07-27
if(pMsg->message==WM_LBUTTONDOWN)
{
FromHandle(pMsg->hwnd)->SendMessage(WM_SYSCOMMAND,SC_MOVE +1,0);
PostMessage(WM_LBUTTONUP);
}
回复
Ghost90 2009-07-27
if (pMsg->message==WM_LBUTTONDOWN)
{
FromHandle(pMsg->hwnd)->PostMessage(WM_SYSCOMMAND,SC_MOVE+1,0);
}
如果鼠标左键按下就移动控件,现在问题是这样 如果执行
FromHandle(pMsg->hwnd)->PostMessage(WM_SYSCOMMAND,SC_MOVE+1,0);
鼠标响应消息就不会被发送到当前控件,因为你移动控件的操作没有结束,这是你在控件上双击鼠标,是可以响应鼠标单击消息的。
正找怎么 结束 SC_MOVE+1 这个消息呢
回复
liuchaotao 2009-07-27
FromHandle(pMsg->hwnd)->PostMessage(WM_SYSCOMMAND,SC_MOVE+1,0);的意思是当你按下鼠标左键时,发出系统消息参数SC_MOVE+1(估计应该是到NEXTWINDOW).估计因为你按LBUTTONDOWN而没有UP就去切换窗口了,所以UP不再响应.你把
if (pMsg->message==WM_LBUTTONDOWN) 换成if (pMsg->message==WM_LBUTTONUP)再试.
回复
yuanye2005king 2009-07-27
谢谢Ghost90,CPathCtrl是我定义的控件,继承自CWnd,OnLButtonUp是在这个我定义的控件上加的消息映射函数。如果把FromHandle(pMsg->hwnd)->PostMessage(WM_SYSCOMMAND,SC_MOVE+1,0);注释掉,OnLButtonUp可以响应,但是CPathCtrl产生的对象就不可以移动了。有没有什么解决方法啊,谢谢。还有FromHandle(pMsg->hwnd)->PostMessage(WM_SYSCOMMAND,SC_MOVE+1,0);主要是什么意思啊?这是我用的别人的代码
回复
yuanye2005king 2009-07-27
谢谢ouyh12345,我也是鼠标按下后实现的up消息啊,但是没有响应。当鼠标抬起的时候没有弹出消息对话框。你说的在其他地方响应down消息是什么意思?呵呵
回复
Ghost90 2009-07-27
CPathCtrl 这是一个控件类???
OnLButtonUp是在 CPathCtrl 这个类上加的?

如果是这样的话,刚试过没问题。

把FromHandle(pMsg->hwnd)->PostMessage(WM_SYSCOMMAND,SC_MOVE+1,0);注销试下呢
回复
ouyh12345 2009-07-27
只有鼠标按下后,系统才响应up消息

估计得在其他地方响应鼠标down消息了
回复
yuanye2005king 2009-07-27
谢谢Ghost90
回复
Ghost90 2009-07-27
你的问题好多!
PostMessage 是把消息发送到消息队列里不管消息函数是否执行,马上返回,SendMessage是等消息执行完再返回。因为 PostMessage 函数立即返回,而你的鼠标左键没没有松开,所以响应不到lButtonUp

SC_MOVE+1,这个参数的低4为是系统用的 +1 +2 +3 都可以,具体原因就不知道了

把 Invalidate 放到 OnLButtonUp 的最后试试
回复
yuanye2005king 2009-07-27
Ghost90前辈,又有个问题了,当按照您的方法设置,OnLButtonUp可以相应,但是OnLButtonDown里面的Invalidate(),即实现OnPaint()重绘没有调用。
回复
yuanye2005king 2009-07-27
Ghost90前辈,SC_MOVE+1是什么意思啊?FromHandle(pMsg->hwnd)->PostMessage(WM_SYSCOMMAND,SC_MOVE+1,0);是我摘抄别人的,只知道这句是为了当鼠标按下移动鼠标的时候控件可以移动的,麻烦您可以不可以在帮我解释下,谢谢
回复
yuanye2005king 2009-07-27
Ghost90前辈,程序可以了。但是为什么用PostMessage不可以呢?这个问题困扰了我好久,今天总于解决了,太感激您了
回复
Ghost90 2009-07-27
[Quote=引用 9 楼 yuanye2005king 的回复:]
谢谢Ghost90,当我在程序中加入PostMessage(WM_LBUTTONUP); 时,这句FromHandle(pMsg->hwnd)->SendMessage(WM_SYSCOMMAND,SC_MOVE +1,0); 就不起作用了,即:鼠标按下拖拽控件的时候控件不在移动了。有没有其它处理办法?谢谢Ghost90
[/Quote]

if(pMsg->message==WM_LBUTTONDOWN)
{
FromHandle(pMsg->hwnd)->SendMessage(WM_SYSCOMMAND,SC_MOVE +1,0);
PostMessage(WM_LBUTTONUP);
}

这么写没问题的 注意这2句的顺序 要用SendMessage

不用老谢了
回复
yuanye2005king 2009-07-27
谢谢Ghost90,当我在程序中加入PostMessage(WM_LBUTTONUP); 时,这句FromHandle(pMsg->hwnd)->SendMessage(WM_SYSCOMMAND,SC_MOVE +1,0); 就不起作用了,即:鼠标按下拖拽控件的时候控件不在移动了。有没有其它处理办法?谢谢Ghost90
回复
yuanye2005king 2009-07-27
谢谢liuchaotao,FromHandle(pMsg->hwnd)->PostMessage(WM_SYSCOMMAND,SC_MOVE+1,0);是用来实现当鼠标在控件上按下拖拽的时候控件移动的,但是我不知道这个消息是什么意思,刚你提提出的方法我试了,OnLButtonUp可以响应了,但是控件不能拖拽了。有没有别的好办法,谢谢
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……