当鼠标移到按钮或其它控件时出现TOOLTIP,请问是怎么做的?

解决方案 »

  1.   

    1、建一个基于对话框的程序TipTest,在CTipTestDlg中增加成员变量:
    CToolTipCtrl m_tip[2],CWnd *m_pSub[2];
    2、在CTipTestDlg::OnInitDialog()函数中增加如下代码: 
    pSub[0] = GetDlgItem(IDC_RADIO1);     //得到单选按钮的指针
    pSub[1] = GetDlgItem(IDC_BUTTON1);
    m_tip[0].Create(pSub[0],TTS_ALWAYSTIP);  //创建CToolTipCtrl
    m_tip[0].AddTool(pSub[0]);               //将CToolTipCtrl与相应的控件对应起来
    m_tip[1].Create(pSub[1],TTS_ALWAYSTIP);
    m_tip[1].AddTool(pSub[1]);
    m_tip[0].SetTipTextColor(RGB(0,0,255));  //设定文字的颜色
    m_tip[0].SetDelayTime(150);              //设定提示文字在控件上停留的时间
    3、重载CTipTestDlg::PreTranslateMessage(MSG* pMsg)函数,增加如下代码:       if(m_tip[0].m_hWnd!=NULL)
    m_tip[0].RelayEvent(pMsg);    
    //如果m_tip[0]句柄不为空,就从主窗口中捕获消息,如WM_MOUSEMOVE,WM_LBUTTONDOWN等消息
    if(m_tip[1].m_hWnd!=NULL)
        m_tip[1].RelayEvent(pMsg);  
    4、捕获主窗口的WM_MOUSEMOVE消息,
    在CTipTestDlg::OnMouseMove(UINT nFlags, CPoint point)函数中增加如下代:          m_tip[0].UpdateTipText("hello!",pSub[0]);  //鼠标在相应的控件上移动时显示提示文字
    m_tip[1].UpdateTipText("http://vckbase.com",pSub[1]);
      

  2.   


    显示工具提示文本
       (1).如果是菜单或工具栏显示,则只要在ID属性的Prompt栏加"\n提示显示".
       (2).在公共控件里显示则需以下步骤:
           <1>.激活工具提示,方法在初始化里(OnInitDialog或OnInitUpdate)调用EnableToolTips();
           <2>.在头文件的类声明中的类消息声明中添加:
               afx_msg BOOL OnNeedToolTipText(UINT id, NMHDR * pTTTStruct, LRESULT * pResult);
           <3>.在源文件中BENGIN_MESSAGE_MAP与END_MESSAGE_MAP之间的类消息表定义中添加:
               ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnNeedToolTipText)
           <4>.在源文件中添加OnNeedToolTipText函数: 
           BOOL CMFCSampleDlg::OnNeedToolTipText(UINT id, NMHDR * pNMHdr, LRESULT * pResult)
      {
          TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *) pNMHdr;       if (pTTT->uFlags & TTF_IDISHWND) {
    UINT idCtrl = ::GetDlgCtrlID(HWND(pTTT->hdr.idFrom));

    pTTT->lpszText = MAKEINTRESOURCE(idCtrl);

    pTTT->hinst    = AfxGetResourceHandle(); return TRUE;
          }         return FALSE;
              }
          <5>.在资源中添加String table资源(要显示的提示信息).一般为IDS_TT_×××_×××.对应控件ID号IDC_×××_×××.
          <6>.在Resource.h文件中修改IDS_TT_×××_×××与IDC_×××_×××同一资源号。
          <7>.如果控件为静态文本(其他待研究)则需使控件有Notify属性。方法2:
    1).在对话框类的.h中加入:
    public:
    CToolTipCtrl m_tip;
    CWnd *pBtn;2).在OnInitDialog中加入:
    pBtn=GetDlgItem(IDC_BUTTON1);//获得控件句柄
    ASSERT(pBtn!=NULL);//判断句柄是否有效
    m_tip.Create(pBtn,TTS_ALWAYSTIP);//创建ToolTip
    m_tip.AddTool(pBtn);//将ToolTip与控件建立关联
    m_tip.SetTipTextColor(RGB(0,0,0));//设置字体前景色
    m_tip.SetTipBkColor(RGB(255,255,255));//设置背景色3).重载PreTranslateMessage
    BOOL CtooltipDlg::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: 在此添加专用代码和/或调用基类
    if(m_tip.m_hWnd!=NULL)
    m_tip.RelayEvent(pMsg); return CDialog::PreTranslateMessage(pMsg);
    }4).重载WM_MOUSEMOVE
    void CtooltipDlg::OnMouseMove(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 m_tip.UpdateTipText("我爱你!!!",pBtn); CDialog::OnMouseMove(nFlags, point);
    }
      

  3.   

    楼上两位回答很精确.
     laiyiling是自己定义消息内容;
     kvw3000主要是在treectrl/listctrl用的比较多,提示信息可以是ITEM当前的内容,也可以自己定义.