其他语言

本类阅读TOP10

·基于Solaris 开发环境的整体构思
·使用AutoMake轻松生成Makefile
·BCB数据库图像保存技术
·GNU中的Makefile
·射频芯片nRF401天线设计的分析
·iframe 的自适应高度
·BCB之Socket通信
·软件企业如何实施CMM
·入门系列--OpenGL最简单的入门
·WIN95中日志钩子(JournalRecord Hook)的使用

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
关于 WM_MOUSEENTER 和 WM_MOUSELEAVE消息。

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

这两个消息比较古怪,虽然你能找到他们的定义,看起来也似乎挺有用,但是却接收不到。刚才csdn有人问到这个问题,我就随手答了一下,随便贴到这里,以做保存。

----------------------------------------

WM_MOUSELEAVE ,WM_MOUSEENTER 应该算是个自定义的消息,因为Windows通常都不会发送这个消息。只有你调用TrackMouseEvent 才会收到这个消息。

实际上这个消息 是 TrackMouseEvent 而不是windows 发出的。很奇怪微软会定义出这样子的API。而且TrackMouseEvent 个人感觉也不大好用(主要是感觉别扭,不是说功能不行)。其实TrackMouseEvent 的原理也蛮简单的,自己三两句语句就搞定了,不必理会微软搞的这个古里古怪的API,还得去查找消息定义。

原理如下:
鼠标在窗口区域时会收到MouseMove消息,第一次收到这个消息时 就是 WM_MOUSEENTER。
On_MouseMove(...)
{
  static BOOL bFirst = TRUE;
  if (bFirst)
  {
    // PostMessage(WM_MOUSEENTER...) or call some function.
    bFirst = FALSE;
    SetTimer(...);
  }  
}

在 Mouse Enter 自后启动了一个计时器, 通常100ms 就足够了。计时器里检测鼠标是否离开。
On_Timer(...)
{
...
  GetCursorPos(pt);
  GetWindowRect(rect);
  if (PtInRect(&rect,pt))
  {
    KillTimer(...); // kill self.
    PostMessage(WM_MOUSELEAVE...); // or call some function.
  }
}




相关文章

相关软件