在VC中给Slider添加定制的Tooltips

VC中的Slider的Tooltips只能显示表示当前位置的int型值,可是有时候,这种Tooltips并不够用。比如,在一个视频录制的小软件中,可能会需要类似“总共500帧,当前是第13帧”的Tooltips;或者有些时候想在Tooltips中显示float型的值。
在这些时候我们就只能用CToolTipCtrl配合TTN_NEEDTEXT消息来实现我们的定制Tooltips。
下面用一个小例子来具体说明:

在VC中给Slider添加定制的Tooltips

首先,给Slider映射一个Control型变量,本例中为:

CSliderCtrlm_slider; // ID为IDC_SLIDERTEST

然后,添加CToolTipCtrl变量和相应TTN_NEEDTEXT的消息函数:

CToolTipCtrlm_tooltips;

BOOLOnToolTipNotify(UINTid,NMHDR
* pNMHDR,LRESULT * pResult);

在cpp文件的消息映射中加入以下代码:

ON_NOTIFY_EX(TTN_NEEDTEXT, 0 ,OnToolTipNotify)

在初始化函数中,添加以下代码:

m_slider.SetRange( 0 , 500 ,TRUE);
m_slider.SetPos(
0 );

// 创建Tooltips
m_tooltips.Create(GetDlgItem(IDC_SLIDERTEST));
m_tooltips.Activate(TRUE);

在OnHScroll函数中添加:

if (pScrollBar == (CScrollBar * )GetDlgItem(IDC_SLIDERTEST))
m_tooltips.Update();
// 更新Tooltips,会触发TTN_NEEDTEXT消息

下面是实现定制Tooltips的函数,也就是相应TTN_NEEDTEXT的消息函数:

BOOLOnToolTipNotify(UINTid,NMHDR * pNMHDR,LRESULT * pResult)
{
TOOLTIPTEXT
* pTTT = (TOOLTIPTEXT * )pNMHDR;
UINTnID
= pNMHDR -> idFrom;
if (pTTT -> uFlags & TTF_IDISHWND)
{
// idFromisactuallytheHWNDofthetool
nID = ::GetDlgCtrlID((HWND)nID);
if (nID)
{
// 这里就是你要显示的Tooltips,可以根据需要来定制
CStringstrToolTips;
strToolTips.Format(
" 总共500帧,当前是第%d帧 " ,m_slider.GetPos());

strcpy(pTTT
-> lpszText,strToolTips);
pTTT
-> hinst = NULL;
return (TRUE);
}
}

return (FALSE);
}

这种方法不仅仅可以实现Slider的定制Tooltips,其他控件也可以用这个方法来实现。

你可能感兴趣的:(tooltip)