显示菜单Tooltip编程
菜单的Tooltip是给菜单给出相应的提示信息,可以关闭也可以打开,当然为了Tooltip相关的色彩显示,专门建立了以CMFCTooltipCtrl为基类的继承类
首先以CMFCTooltipCtrl为基础,建立类CMyToolTipCtrl,并重载相关的属性函数OnFillBackground(), OnDrawSeparator( ),绘制Tooltip的背景、图标及文本的颜色。
voidCMyTooltip::OnDrawSeparator( CDC* pDC, int x1, int x2, int y )
{
ASSERT_VALID (pDC);
CDrawingManager dm (*pDC);
CRect rect (x1, y, x2, y + 1);
dm.FillGradient(rect, RGB (255, 201, 109), RGB (255, 247, 225), FALSE);
}
voidCMyTooltip::OnFillBackground( CDC* pDC, CRect rect, COLORREF& clrText, COLORREF& clrLine )
{
ASSERT_VALID(pDC);
CDrawingManager dm(*pDC);
dm.FillGradient2(rect,RGB (104, 165, 225), RGB (37,92, 222), 90);
clrLine= RGB (113, 166, 246);
clrText= RGB (255, 255, 255);
}
随后重载OnMenuButtonToolHitTest()函数,以便获得鼠标点击菜单或者图标的消息,以便显示Tooltip。
BOOL CMainFrame::OnMenuButtonToolHitTest(CMFCToolBarButton* pButton, TOOLINFO* pTI)
{
ASSERT_VALID(pButton);
ASSERT(pTI != NULL);
if (!theApp.m_bTTInPopupMenus || pButton->m_nID == 0 || pButton->m_nID == (UINT)-1)
{
return FALSE;
}
CStringstrText = pButton->m_strText;
strText.Remove(_T('&'));
if (strText.IsEmpty ())
{
return FALSE;
}
if (pTI)
{
pTI->lpszText= (LPTSTR) ::calloc ((strText.GetLength () + 1), sizeof(TCHAR));
if (pTI->lpszText)
{
lstrcpy(pTI->lpszText, strText);
}
}
return TRUE;
}
然后再在视类中加入不同类型的Tooltip处理程序
voidCTooltipViewView::OnApplyTooltip()
{
afxGlobalData.m_nMaxToolTipWidth= 200;
theApp.m_bTTInPopupMenus= TRUE;
if (m_nType == 0) // Standard tooltip
{
theApp.GetTooltipManager()->SetTooltipParams (
AFX_TOOLTIP_TYPE_ALL,
NULL,
NULL);
return;
}
if (m_nType == 1) // Balloon tooltip
{
CMFCToolTipInfoparamsBalloon;
paramsBalloon.m_bBalloonTooltip= TRUE;
theApp.GetTooltipManager()->SetTooltipParams (
AFX_TOOLTIP_TYPE_ALL,
RUNTIME_CLASS(CMFCToolTipCtrl),
¶msBalloon);
return;
}
if(m_nType == 2)
{
CMFCToolTipInfoparams;
params.m_bBoldLabel= TRUE;
params.m_bDrawDescription= TRUE;
params.m_bDrawIcon= TRUE;
params.m_bRoundedCorners= TRUE;
params.m_bDrawSeparator= TRUE;
params.m_clrFill= RGB (255, 255, 255);
params.m_clrFillGradient= RGB (228, 228, 240);
params.m_clrText= RGB (61, 83, 80);
params.m_clrBorder= RGB (144, 149, 168);
theApp.GetTooltipManager()->SetTooltipParams (
AFX_TOOLTIP_TYPE_ALL,
RUNTIME_CLASS(CMFCToolTipCtrl),
¶ms);
return;
}
if(m_nType == 3)
{
theApp.GetTooltipManager()->SetTooltipParams (
AFX_TOOLTIP_TYPE_ALL,
RUNTIME_CLASS(CMyTooltip));
}
}
最终软件界面: