我做了一个Ocx组件,里面有一个小Dlg,dlg上有几个按钮。请问如何给这些按钮加ToolTip?
在线等待,请速回帖。100分一定送上。

解决方案 »

  1.   

    1、选择“Project”菜单,然后“Set Active Project” 。
    2、选择“Project”菜单 -->“Add to Project” -->“Components and Controls” -->“VC++ Components” --> “ToolTip Support” 
    3、选择“Insert” 
    4、在对话框资源中加入一个按钮,ID为IDC_ToolTip
    5、在 CDialog::OnInitDialog() 中找到下面的注释行:   // TODO: Use one of the following forms to add controls:
       // m_tooltip.AddTool(GetDlgItem(IDC_), );
       // m_tooltip.AddTool(GetDlgItem(IDC_), "");
    然后在注释行后加入一行代码:
       m_tooltip.AddTool(GetDlgItem(IDC_ToolTip), "显示 ToolTip");
    经过上面的步骤之后:头文件(*.h)中会自动加入下面的代码:
       public:
          virtual BOOL PreTranslateMessage(MSG* pMsg);实现文件(*.cpp)会加入方法实现:
          PreTranslateMessage(MSG* pMsg);编译程序执行吧,将鼠标指针移到ToolTip按钮上就会显示出一个ToolTip信息。
      

  2.   

    以下提供一篇工具栏中的ToolTip实现,可以转换到Button上去。1、选择按钮的风格中加入TOOLTIPS的风格。
    2、然后增加一个消息函数定义:
       afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult);
    3、增加消息映射:
       ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText);
    4、消息函数实现:
       ………………………………
       TOOLTIPTEXTA *pTTTA = (TOOLTIPTEXTA *)pNMHDR;
       TOOLTIPTEXTW *pTTTW = (TOOLTIPTEXTW *)pNMHDR;
       
       CString strTipText;
       UINT uID = pNMHDR->idForm;
       
       if(pNMHDR->code == TTN_NEEDTEXTA && (pTTTA ->uFlags & TTF_IDISHWND_\) || pNMHDR->code ==  TTN_NEADTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
             uID = ::GetDlgCtrlID((HWND)uID);  //idForm位工具栏的HWND
       
        if(uID != 0)   //不为分割符
        {
           strTipText.LoadString(uID);
           strTipText = strTip.Mid(strTipText.Find('\n', 0) + 1);#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_NEEDTEXTW)
             _wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTW->szText));
          else
             lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
    #endif     *pResult = 0;
         ::SetWindowPos(pNMHDR->hwndForm, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER);
         
         return TRUE;
         }
       
         return TRUE;
    }
      

  3.   

    直接用CTooTipCtrl
    1.在.h裡面申請
    CToolTipCtrl m_tooltip;
    2.在OnInitDialog()加入下面倆句話.
    m_tooltip.Create(this);
    m_tooltip.Activate(TRUE);
    3.給Dialog程序添加PreTranslateMessage(MSG* pMsg)事件處理
    函數題裡面再加入m_tooltip.RelayEvent(pMsg);這個代碼。
    4.給需要的button添加和下面類似的代碼
    m_tooltip.AddTool(&m_ButtonPlay,"Play");
    m_tooltip.AddTool(&m_ButtonRecord,"Record");
    //可以在任意你想要開始tooltip的地方加這樣的代碼.也可以放在初始里
    //其中m_ButtonPlay是button的類(控件名稱)名字."Play"是toolTip內容
      

  4.   

    不知道为什么,用上面的方法没用?
    我的Button是在资源里画上去的,我用了一个CMyButton类(从CBitmapButton派生)的Autoload,movewindow先处理了一下,然后就是 m_tooltip.AddTool(GetDlgItem(IDC_OT_LINE),"text");

            m_tooltip.AddTool(&m_btnPen,"text");
    其它地方(PreTranslateMessage)也加上了。
    可Tooltip就是不出来。
      

  5.   

    推荐用dominolili(domino) ( ) 信誉:100 的方法很好用阿我试了一下,只需加上
    m_tooltip.AddTool(GetDlgItem(IDC_TOOLTIP), "显示 ToolTip");
    就可以了,方便易用!!!
      

  6.   


    你既然生成了自己的类,可以在类中加入成员变量 CToolTipCtrl m_ToolTip;
    然后重载 PreSubClass(), PreTranslateMessage()
    最后加入成员函数 SetToolTipText()实现如下:*.h
    class CXXXButton:CButton
    {
        ......
    protected:
        static CToolTipCtrl m_ToolTip;
        ......public:
        void SetToolTipText(LPCSTR lpszToolTipText);
        .....
    };
    *.cpp
    CToolTipCtrl CXXXButton::m_ToolTip;void CXXXButton::PreSubclassWindow() 
    {
    if(!m_ToolTip.GetSafeHwnd())
    m_ToolTip.Create(this);
    m_ToolTip.AddTool(this);
    CButton::PreSubclassWindow();
    }
    BOOL CXXXButton::PreTranslateMessage(MSG* pMsg) 
    {
    m_ToolTip.RelayEvent(pMsg);
    return CButton::PreTranslateMessage(pMsg);
    }void CXXXButton::SetToolTipText(LPCSTR lpszToolTipText)
    {
    m_ToolTip.UpdateTipText(lpszToolTipText, this);
    }
      

  7.   

    我试了,还是不行,我跟了一下,根本就没有进PreTranslateMessage
    我的对话框是组件Ctrl类创建的主Dlg下的子窗口(在Dlg的OnInitDialog下创建)
      

  8.   

    问题解决了。
    由于根本就不进Button类的PreTranslateMessage,所以我在Button类的OnMouseMove中加了一个Timer,当鼠标在Button内停留一段时间后就进入OnTimer。
    在OnTimer中,我生成了一个MSG对象,然后是
    m_ToolTip.RelayEvent(pMsg),就OK了。结账了,
    dominolili:基本是按照你说的作的,给你 25分。
    jennyvanes: 虽然没用上,不过写了那么多,给你10分。
    YP2002CN:   25分。
    shadowac:  基本是按照你说的作的,30分。
    andy_lau():5分
    differ:     5分 
      

  9.   

    你可以在Ctrl类里的PreTranslateMessage函数里发m_ToolTip.RelayEvent(pMsg)