假设在CDlg**中有一控件IDC_EDIT_A,想要鼠标指向该控件时提示,步骤如下:


1、CDlg**头文件中声明成员变量

CToolTipCtrl m_tooltip;


2、CDlg***::OnInitDialog() 中创建并设置参数

m_tooltip.Create(this);


//CToolTipCtrl与控件关联

m_tooltip.AddTool(GetDlgItem(IDC_EDIT_A), TTS_ALWAYSTIP);//当鼠标指向IDC_EDIT_A控件显示提示

//若如是句柄可以用FromHandle(hwnd)替换 GetDlgItem(IDC_EDIT_A)


//文字颜色

m_tooltip.SetTipTextColor(RGB(0,0,255));


//鼠标指向多久后显示提示,毫秒

m_tooltip.SetDelayTime(TTDT_INITIAL, 10);


//鼠标保持指向,提示显示多久,毫秒

m_tooltip.SetDelayTime(TTDT_AUTOPOP, 30000);


//设定显示宽度,超长内容自动换行

m_tooltip.SetMaxTipWidth(200);


3、重写PreTranslateMessage,增加以下内容:

if(m_tooltip.m_hWnd!=NULL)

{

m_tooltip.RelayEvent(pMsg);

}


4、在需要的地方动态更新tip内容

m_tooltip.UpdateTipText(str, FromHandle(hwnd));


MFC 中 Tooltip 实现的几种方式


方法一:

利用CWnd本身自身支持的tooptip来实现,这种方法适用给控件增加tooltip,非常方便和简单方法如下:

1、在窗口中增加消息映射ON_NOTIFY_EX(TTN_NEEDTEXT, 0, SetTipText)

SetTipText是个回调函数,名字叫什么无所谓,符合原型就行了,原型下面会说。


2、EnableToolTips(TRUE),使用这个方法调用这个函数是必不可少的.建议在CDialog::OnInitDialog调用。


3、在窗口中增加一个函数用于动态提供显示内容,其原型为 BOOL SetTipText(UINT id, NMHDR *pTTTStruct, LRESULT *pResult),下面的代码可以根据传入的参数判定应该显示的内容。  

BOOL CWndYour::SetTipText(UINT id, NMHDR *pTTTStruct, LRESULT *pResult)  

{  

   TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;          

   UINT nID = pTTTStruct->idFrom;   //得到相应窗口ID,有可能是HWND  

   //表明nID是否为HWND

   if (pTTT->uFlags & TTF_IDISHWND)  

   {

       //从HWND得到ID值,当然你也可以通过HWND值来判断

       nID = ::GetDlgCtrlID((HWND)nID);

       if (NULL == nID)

           return FALSE;


       switch(nID)

       {

       case(IDC_YOUR_CONTROL1)                  

           strcpy(pTTT->lpszText, your_string1);    

           break;  

       case(IDC_YOUR_CONTROL2)  

           //设置相应的显示字串  

           break;  

       default:

           break;

       }

       return TRUE;

   }  

   return FALSE;  

}  


4、很重要的一点,要显示的控件必须设置notify属性,否则收不到notify消息,自然也就显示不了tooltip。



方法二:

使用MFC中封装好的CToolTipCtrl类,步骤如下:

1、定义全局变量 CToolTipCtrl  m_tooltip和CWnd* pwnd,pwnd用来指定要显示控件的指针

2、在窗体的OnInitDialog()中或OnShowWindow()中创建m_tooltip。


//创建m_tooltip

m_tooltip.Create(pwnd);


//将CToolTipCtrl与相应的控件对应起来

m_tooltip.AddTool(pwnd, TTS_ALWAYSTIP);


//设定文字的颜色

m_tooltipSetTipTextColor(RGB(0,0,255));


//设定提示文字在控件上停留的时间

m_tooltip.SetDelayTime(150);            


3、重载PreTranslateMessage(MSG* pMsg)函数,增加如下代码:

if(m_tooltip.m_hWnd!=NULL)  

 m_tooltip.RelayEvent(pMsg);


4、捕获主窗口的WM_MOUSEMOVE消息,在OnMouseMove(UINT nFlags, CPoint point)函数中增加如下代码:


//鼠标在相应的控件上移动时显示提示文字

m_tooltip.UpdateTipText("怎么样",pwnd);


5、说明

其实上面的第四步可以不要,就是在AddTool时,就可以将它的第二个参数就设置为提示文字,至于风格可以在Create的时候设置。


方法三:

自己封装SDK中的这个控件,难度是大点,但是可控性和适用性都可以大大提高。


// 常量定义

// tooltip

#define TTS_BALLOON  0x40

#define TTS_CLOSE  0x80

#define TTS_NOFADE  0x20


m_tooltip.Create(this, TTS_BALLOON | TTS_ALWAYSTIP | TTS_CLOSE | TTS_NOFADE);

m_tooltip.Activate(TRUE);

m_tooltip.AddTool(this, DEFINE_INFO_FLOATTIP);

m_tooltip.SetTipTextColor(RGB(0, 0, 255));

m_tooltip.SetTipBkColor(RGB(255,0,255));

m_tooltip.SetDelayTime(150);