WEB开发网
开发学院软件开发VC MFC教程(13)-MFC工具条和状态栏(2) 阅读

MFC教程(13)-MFC工具条和状态栏(2)

 2007-10-04 20:11:26 来源:WEB开发网   
核心提示:OnToolTipText也是一个处理通知消息的例子,其中,MFC教程(13)-MFC工具条和状态栏(2)(6),通知参数wParam的结构如4.4.4.2节所述,具体如下:typedef struct {NMHDR hdr; //WM_NOTIFY消息要求的头LPTSTR lpszText; //接收工具条按钮对应文

OnToolTipText也是一个处理通知消息的例子。其中,通知参数wParam的结构如4.4.4.2节所述,具体如下:

typedef struct {
NMHDR hdr; //WM_NOTIFY消息要求的头
LPTSTR lpszText; //接收工具条按钮对应文本的缓冲区
WCHAR szText[80]; //接收Tooltip显示文本的缓冲区
HINSTANCE hinst; //包含了szText的实例句柄
UINT uflags; //标识了NMHDR的idFrom成员的意义
} TOOLTIPTEXT, FAR *LPTOOLTIPTEXT;

uflags如果等于TTF_IDISHWND,则表示通知消息来自对话框工具条的一个子窗口,而不是包含工具条按钮。

OnToolTipText根据子窗口ID或者工具条按钮对应的ID,得到字符串ID。如前所述,字符串ID由两部分组成,第二部分用于Tooltip显示,分隔符号是“ ”。根据这种格式OnToolTipText分离出Tooltip文本。

得到了Tooltip文本之后,可以有三种方法返回文本信息:把文本信息复制到szText缓冲区;把文本地址复制到lpszText;复制字符串资源的ID到lpszText、复制包含资源的实例句柄到hint。本函数采用了第一种方法。

在得到了返回的Tooltip文本之后,该文本在Tooltip窗口中被显示出来。

其他的OnToolHist等函数的实现不作详细的解释了。下面,讨论CBRS_FLYBY风格的实现。

CBRS_FLYBY风格的实现

CBRS_FLYBY是MFC提供的特征。当鼠标落在工具条按钮(或者对话框工具条的子窗口)上且稳定300ms后,在状态栏显示对应的提示信息。如果选中某个按钮或者子窗口(鼠标左键按下),则在相应命令消息处理之前在状态栏显示有关提示信息,之后(鼠标左键弹起),重新设置状态栏的状态信息。

为了支持这种特征,CControlBar覆盖虚拟函数PreTranslateMessage来处理和CBRS_FLYBY相关的消息,该函数前面已经讨论过,这里解释它如何处理CBRS_FLYBY特征。

如果同时具备

条件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特征的支持实现描述完毕。

上一页  1 2 3 4 5 6 7 8 9 10 11  下一页

Tags:MFC 教程 MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接