+ -
当前位置:首页 → 问答吧 → 关于GetCursorPos()获取当前鼠标坐标位置不对的问题

关于GetCursorPos()获取当前鼠标坐标位置不对的问题

时间:2011-12-22

来源:互联网

我想实现鼠标点击我的按钮不放,会有重复按此按钮的效果,并且重点是当鼠标点击按钮不松左键的情况下将鼠标移开此按钮的区域时,实现松开此按钮的功能,当我鼠标(左键仍然不松开)再次移回该按钮区域时又会有重复按此按钮的效果
BOOL Cxx::PreTranslateMessage(MSG* pMsg)
{
  CRect rt;
  CPoint pt;
  (GetDlgItem(BUTTONID))->GetWindowRect(&rt);
  if(pMsg->message == WM_LBUTTONDOWN && pMsg-> hwnd == GetDlgItem(backspace)-> GetSafeHwnd())
  {
  GetCusorPos(&pt);
  if(PtInRect(&rt,pt))
  {
  setTimer(1,500,NULL);
  }
  if(pMsg->message == WM_LBUTTONUP)
  {
  KillTimer(1);
  }
  return CDialog::PreTranslateMessage(pMsg);
}
但是,似乎GetCusorPos(&pt)这个函数获得的位置信息不对呀,我用一个MessageBox输出pt.x和pt.y的值,发现不管我点的屏幕哪里,他得到的值都是一样的:x=525328,y=0,然后我用ScreenToClient()后,得出的值为:x=525212,y=-46这是为什么呀?我如何才能得到正确的鼠标位置信息呢?请各位指教……

作者: xm877   发布时间: 2011-12-22

在pMsg->pt里面就是你想要的值,不必用GetCursorPos了,呵呵
typedef struct tagMSG {
  HWND hwnd;
  UINT message;
  WPARAM wParam;
  LPARAM lParam;
  DWORD time;
  POINT pt;
} MSG, *PMSG, *LPMSG;

pt
Type: POINT
The cursor position, in screen coordinates, when the message was posted. 

作者: tangssm1   发布时间: 2011-12-22

楼上说的不错。。

会有重复按此按钮的效果,

WM_LBUTTONUP WM_LBUTTONDOWN 你要注意区别,

一直按着就是 down消息。。

作者: shen_wei   发布时间: 2011-12-22

呵呵,解决啦,但是我还有以下几个问题
1、当我用pMsg->pt来判断时,设置断点查看pt的值时,它的值始终是0,0,这是为什么呀?
2、当我用if(PtInRect(&rt,pt)&&pMsg->message == WM_LBUTTONDOWN)来判断时,长按按钮没反应,但是去掉&&pMsg->message == WM_LBUTTONDOWN以后就可以了,何解?
3、如果我用pMsg->pt时,setTimer()中的时间值就要设小点,400以上要按N久才会有反应,起初让我误以为pMsg->pt是没用的……

作者: xm877   发布时间: 2011-12-22

设置断点查看pt的值时,你单击窗口了没有。。。
没有的话,哪里有值??

作者: shen_wei   发布时间: 2011-12-22

有的,不管我单击窗口哪里,pt的值始终是0,0

作者: xm877   发布时间: 2011-12-22

你如果点击的不是窗口所在的区域,坐标怎么可能会正确呢?没有消息响应啊

作者: VisualEleven   发布时间: 2011-12-22

引用 6 楼 visualeleven 的回复:

你如果点击的不是窗口所在的区域,坐标怎么可能会正确呢?没有消息响应啊

没看懂,我点的就是窗口里的按钮呀?怎么会没有消息响应呢?

作者: xm877   发布时间: 2011-12-22

热门下载

更多