触发消息以及执行相应的程序代码总是需要时间的,而在这段时间内,你的鼠标光标可能已经移动了好几个点了。所以,没办法!
至于坐标是否转换,得你自己看着办——反正从消息中得到的坐标是 Screen 的。

解决方案 »

  1.   

    如果你只是要判断鼠标是否进入控件或者离开,为什么不用 SetCapture 呢?这样,不管鼠标是否在你的控件上,这个控件都可以得到消息,你只需要判断鼠标坐标是否在控件内就可以了。如果不在控件内,则表示移出,同时 ReleaseCapture,待下一次 MouseMove 事件的时候,再 SetCapture,……如此反复!设置 1 个变量表示鼠标是否在控件上,如 BOOL mouseIn
    假设从鼠标消息得到的坐标点为 CPoint p
    控件所在矩形区假设为 CRect r
    那么在相关消息处理函数中可能写如下代码
    if (r包含(p) && !mouseIn) {
      SetCapture();
      执行鼠标进入需要执行的函数
    }
    else if (!r包含(p)) {
      ReleaseCapture();
      执行鼠标移出需要执行的函数
    }对不起,判断矩形是否包含点的函数名我忘了,你自己查查MSDN 吧
      

  2.   

    同意楼上,用SetCapture()和ReleaseCapture()可以很好的解决这个问题!!
    判断矩形是否包含点的函数名是:
    CRect rc;
    rc.PtInRect(point);
      

  3.   

    有一个函数,是GetGapture(),可以使你省一个bool变量