BOOL CMyToolTipCtrl::AddWindowTool(CWnd *pWnd, LPCTSTR pszText)
{
TOOLINFO ti;
ti.cbSize=sizeof(TOOLINFO);
ti.hinst=AfxGetInstanceHandle();
ti.hwnd=pWnd->GetParent()->GetSafeHwnd();
ti.uFlags=TTF_SUBCLASS|TTF_IDISHWND;
ti.uId=(UINT)pWnd->GetSafeHwnd();
ti.lpszText=(LPTSTR)pszText;
if((bool)SendMessage(TTM_ADDTOOL,0,(LPARAM)&ti))
{
this->MessageBox(_T("s"));
return true;
}
else
{
this->MessageBox(_T("f"));
return false;
}}上面是一个CToolTipCtrl的派生类的一个函数。下面是BOOL Ctemp2Dlg::OnInitDialog()中的调用。
tt.Create(this);
tt.AddWindowTool(GetDlgItem(IDOK),_T("这个是确定按钮!"));为什么还是不会出现提示文本?一直返回FALSE,难道还有什么其它的东西要写?
那个CMyToolTipCtrl是我从光盘提供的代码拿过来的,应该不会有问题,书中的例子可以正常运行。

解决方案 »

  1.   

    初始化
    EnableToolTips(TRUE);
    tt.Create(this);
    tt.Activate(TRUE);
    tt.AddTool(GetDlgItem(IDC_IDOK),_T("这个是确定按钮"));//重写PreTranslateMessage函数BOOL PreTranslateMessage(MSG* pMsg)
    {
    // TODO: 在此添加专用代码和/或调用基类
    m_ToolTipCtl.RelayEvent(pMsg); return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   


    这种方法好像只能用于CToolTipCtrl的父窗口。现在我这个CToolTipCtrl的父窗口上有好几个控件。要提示这些控件不能用这种方法的好像?
    如我理解不对,请指正。
      

  3.   


    上面引用错了,不好意思,应该引用1楼的。
    这种方法好像只能用于CToolTipCtrl的父窗口。现在我这个CToolTipCtrl的父窗口上有好几个控件。要提示这些控件不能用这种方法的好像? 
    如我理解不对,请指正。
      

  4.   

    重写PreTranslateMessage函数这个方法,只适用于某一类窗口(被重载的那个类)。
    我现在要实现一个CMyToolTipCtrl().只要调用AddWindowTool就可以用于大多数的控件。
      

  5.   

    如果你没对CToolTipCtrl进行大改造,不去调用m_ToolTipCtl.RelayEvent(pMsg); 上面的例子好像是没有提示信息。
    看过一个自定义的ToolTip, 好像控件也会要在例如鼠标消息触发时,发送一个特定的Tip消息,而ToolTip就获取这Tip消息并给出你要的提示,在AddTool时,ToolTip会记录与它绑定控件。这过程好像少不了。理解不是很深,个人看法。
      

  6.   

    这里需要重写PreTranslateMessage()函数,因为在按键被按下或者鼠标移动等发送的消息在
    这个函数下都可以捕捉的到,而CToolTipCtrl类使用的是鼠标移动到某个控件上来弹出提示窗口
    ,所以在这我们需要捕捉到这个消息并发送给CToolTipCtrl类,以便提示窗口能够弹出。而在
    CToolTipCtrl类中接受并处理这消息的函数就是RelayEvent()函数,所以加上吧
      

  7.   

    AddWindowTool()函数一次只能绑定一个控件,如果想绑定多个控件
    则需要多次调用这个函数才可以。RelayEvent()函数可以接收并处理
    所有绑定的控件,这个不用担心。
      

  8.   

    BOOL PreTranslateMessage(MSG* pMsg)
    {
        // TODO: 在此添加专用代码和/或调用基类
        m_ToolTipCtl.RelayEvent(pMsg);    return CDialog::PreTranslateMessage(pMsg);
    }
      

  9.   

    原来是版本的问题,代码没有任何问题,我在VS2005里。书中例子是在VS6.0里。可以算作VS2005的BUG吧