关于实现onmouseleave功能:
这里要实现鼠标移入一个按钮,换一张图片,点击按钮换一张图片,移出再换回去,但如果是左键按住按钮移出按钮则也变成normal图片,
因为windows中没有直接实现mouseleave的函数,但可以通过mousemove和跟踪鼠标函数_TrackMouseEvent来判断。
_TrackMouseEvent函数的作用是在制定时间里当发生鼠标离开window或者盘旋在window中时出发相应事件,如TRACKMOUSEEVENT结构体如果参数中有TME_LEAVE,则跟踪是否离开window,如果有TME_HOVER,则跟踪是否盘旋在window中,那如果有TME_CANCEL|TME_LEAVE 则表示取消掉TME_LEAVE,如果一旦跟踪发现鼠标离开window或者没有盘旋在window中,则发送消息到WM_MOUSELEAVE或WM_MOUSEHOVER,并且_TrackMouseEvent失效,如果要继续跟踪则重新调用注册。参数4中如果为0,表示一直跟踪。
下面开始讲述如果实现mouseleave
1:当在重绘函数drawitem中,的结构体LPDRAWITEMSTRUCT中有成员变量itemstate,表示当前按钮状态,包括选中(ODS_DISABLE),高亮(focus),等。
2:初始时按钮为被down,也无鼠标跟踪(如标志标量tracking=false),当mouseleave时 判断tracking是否为false,是的话调用注册鼠标跟踪函数,当次函数成功调用时,返回非零值,将tracking=true,表示正在跟踪。
3:如果此时鼠标down按钮,则判断tracking是否为true,是的话取消跟踪,置tracking为false
4:当鼠标再次移动时,不管此事鼠标左键是否是按下状态,都将因为当前标志变量trackig为false而重新调用注册跟踪数遍函数,然后修改tracking为true。
5:当鼠标move时,当按钮处于down时,且::GetCapture()==m_hWnd说明,鼠标还在按钮窗口中移动,否则,说明鼠标离开按钮窗口,,此时虽然仍在响应mousemove事件,但不需要再进行任何其他操作了,此时除离开时重绘按钮图,此后就不需要再更新按钮位图,从而不会出现按钮位图闪烁了。
6:判断是用那张图时,只需要判断当前itemstate是否出于select按钮中,即进行lpdrawitemstruct->itemstate&osd_select判断是否处于down的状态。是否处于tracking是否为true,为true说明鼠标在按钮的window中。此时如果已经是按钮被按下且tracking为true,说明在按钮中按住左键的状态,否则当tracking是false,则说明鼠标离开按钮、