許久之前遇上一個問題 - MFC 的 Dialog 中, 為何 CToolBar 的 tooltip 無效?
在網路上轉了半天, 盯著 MSDN 的 CBRS_TOOLTIPS 發呆,
想說這個不就是會讓 tooltip 閃閃發亮的參數嗎?
實際上, CBRS_TOOLTIPS 對 docuement/view 的 SDI/MDI 都有效,
但 CDialog 沒有處理對應 message 的 message handler,
還好網上早有高人解答, 只要增加 TTN_NEEDTEXTW, TTN_NEEDTEXTA 的 message handler.
為了紀念轉了四五個小時的搜尋, 不只引用, 也鄭重地貼上原文:
http://www.wangchao.net.cn/bbsdetail_748638.html
改編文
CToolBar 一般用在 SDI 或是 MDI,
如果我們在一個Dialog里新建了一個CToolBar,它的提示信息可能就沒有辦法出來了。
主要的原因是由於我們沒有為這個CToolBar寫提示信息的消息映射函數。 如果要增加的話,
0) 設定 tooltips 給 toolbar, 設定 toolbar button 之 prompt
1) 建立 message mapping
2) 建立 message handler
3) 加上 header
0.1 ToolBar 設定為有 tooltips
CToolBar mToolBar;
mToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE| CBRS_TOOLTIPS);
0.2 在 ToolBar button 的屬性 prompt, 加上對應之 tooltip
1. 建立消息映射
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
2. 增加 message handler OnToolTipText()
afx_msg BOOL OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
BOOL MyDlg::OnToolTipText(UINT nFlags, NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
// if there is a top level routing frame then let it handle the message
if (GetRoutingFrame() != NULL) return FALSE;
// to be thorough we will need to handle UNICODE versions of the message also !!
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
TCHAR szFullText[512];
CString strTipText;
UINT nID = pNMHDR->idFrom;
if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
{
// idFrom is actually the HWND of the tool
nID = ::GetDlgCtrlID((HWND)nID);
}
if (nID != 0) // will be zero on a separator
{
AfxLoadString(nID, szFullText);
strTipText=szFullText;
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
{
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
}
else
{
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
}
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
{
_wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
}
else
{
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
}
#endif
*pResult = 0;
// bring the tooltip window above other popup windows
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
return TRUE;
}
return FALSE;
}
3.增加一個頭文件 // 不確定是否必要