MFC教程(13)-- MFC工具条和状态栏(2)
2007-03-18 21:29:40 来源:WEB开发网如果同时具备
条件1:控制条具有CBRS_FLYBY特征或者当前消息是WM_LBUTTONUP或者WM_LBUTTONDOWN。
条件2:当前消息是鼠标消息(在WM_MOUSEFIRST和WM_MOUSELAST之间或者在WM_NCMOUSEFIRST和WM_NCMOUSELAST之间)。
则进行FLYBY处理。
首先,调用OnToolHitTest测试用户是否选中了工具条的按钮或者子窗口;
如果没有按钮或者子窗口被选中,则重新设置状态栏的状态,取消曾经设置的Check定时器。重置状态栏的状态时调用了SetStatusText(int nHit)函数,它是CControlBar内部使用的函数,若nHit等于-1,它向父窗口发送WM_POPMESSAGETEXT,消息参数是AFX_IDS_IDLEMESSAGE,结果导致状态栏显示“Ready”字样;否则发送WM_SETMESSAGETEXT消息,wParm设置为nHit,结果导致在状态栏显示ID为nHit的字符串。
如果有按钮或者子窗口被选中,若左键弹起,则重新设置状态栏信息,取消Wait定时器,并重新设置Check定时器,定时是200ms;若左键按下,则在状态栏显示消息ID对应的提示信息;若是其他鼠标消息,如果当前鼠标所在按钮(子窗口)不同于最近一次,则取消Check定时器,重新设置Wait定时器,定时300毫秒。
CControlBar覆盖了消息处理函数OnTimer,在指定时间之后,检查鼠标位置,如果鼠标还在某个按钮或者子窗口上,则在状态条显示提示信息。Wait定时器在等待之后准备在状态条显示信息,触发一次后被取消;Check定时器在等待之后,判断是否需要取消状态条当前显示的信息,重新设置状态条,若这样的话,同时也取消Check定时器。
注意,这些鼠标消息被处理之后,并没有终止,它们将继续被发送给控制条的窗口过程处理。
至此,CBRS_FLYBY特征的支持实现描述完毕。
更多精彩
赞助商链接