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

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

 2007-03-18 21:29:40 来源:WEB开发网   
核心提示: CWnd的PreTranslateMessage在4.5节讨论过,它的实现如下:BOOL CWnd::PreTranslateMessage(MSG* pMsg){//处理Tooltip消息AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GE

CWnd的PreTranslateMessage在4.5节讨论过,它的实现如下:

BOOL CWnd::PreTranslateMessage(MSG* pMsg)
{
//处理Tooltip消息
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
if (pModuleState->m_pfnFilterToolTipMessage != NULL)
//导致调用FilterTooltipMessage
(*pModuleState->m_pfnFilterToolTipMessage)(pMsg, this);
//不是Tooltip消息
return FALSE;
}

至于为什么MFC在模块状态中保存一个处理Tooltip消息的函数地址,通过该函数调用FilterTooltipMessage,是因为Tooltip窗口是模块线程局部有效的。

FilterTooltipMessage检测是否是Tooltip消息。如果是,在必要时创建一个CTooltipCtrl对象和对应的HWND,调用OnToolHitTest确定被选中的按钮或者控制的ID,接着弹出Tooltip窗口。

其他函数和CTooltipCtrl这里不作详细论述了。

处理TTN_NEEDTEXT通知消息

Tooltip窗口在弹出之前,它给工具条(或者对话框工具栏)的父窗口发送通知消息TTN_NEEDTEXT,请求得到要显示的文本。

CFrameWnd类处理了TTN_NEEDTEXT通知消息,消息处理函数是OnToolTipText。

消息映射的定义:

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)

这里,使用了扩展消息映射宏把子窗口ID在0和0xFFFF之间的控制条窗口的通知消息TTN_NEEDTEXTA和TTN_NEEDTEXTW映射到函数OnToolTipText。

消息映射的实现:

BOOL CFrameWnd::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXTA ||
pNMHDR->code == TTN_NEEDTEXTW);
//让上一层的边框窗口优先处理该消息
if (GetRoutingFrame() != NULL)
return FALSE;
//分ANSI and UNICODE两个处理版本
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
TCHAR szFullText[256];
CString strTipText;
UINT nID = pNMHDR->idFrom;
//如果idFrom是一个子窗口,则得到其ID。
if (pNMHDR->code == TTN_NEEDTEXTA &&
(pTTTA->uFlags & TTF_IDISHWND) ||
pNMHDR->code == TTN_NEEDTEXTW &&
(pTTTW->uFlags & TTF_IDISHWND))
{
//idFrom是工具条的句柄
nID = _AfxGetDlgCtrlID((HWND)nID);
}
if (nID != 0) //若是0,为一分隔栏,不是按钮
{
//得到nID对应的字符串
AfxLoadString(nID, szFullText);
//从上面得到的字符串中取出Tooltip使用的文本
AfxExtractSubString(strTipText, szFullText, 1, '
');
}
//复制分离出的文本
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, strTipText, _countof(pTTTA->szText));
else
_mbstowcsz(pTTTW->szText, strTipText, _countof(pTTTW->szText));
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
_wcstombsz(pTTTA->szText, strTipText, _countof(pTTTA->szText));
else
lstrcpyn(pTTTW->szText, strTipText, _countof(pTTTW->szText));
#endif
*pResult = 0;
//显示Tooltip窗口
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE);
return TRUE; //消息处理完毕
}

OnToolTipText是一个扩展映射宏定义的消息处理函数,所以有一个UINT参数并且返回BOOL类型的值。不过,由于第二个参数(NMHDR)的idFrom域包含了有关信息,所以第一个UINT类型的参数没有用上。

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

Tags:MFC 教程 MFC

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