我的情况:
  在基于文档TEST的工程中,在CFrame中
  m_wndHBar.CreateEx使用了CBRS_TOOLTIPS,运行时
  tooltip可以显示出来。  但当将该工程打包成*.Dll
   __declspec(dllexport) BOOL TEST_ShowWindow(BOOL bShow);BOOL TEST_ShowWindow(BOOL bShow)
{//...........
//////////////////////////注册框架
AFX_MODULE_STATE* pBaseModuleState = AfxGetAppModuleState();
AFX_MODULE_THREAD_STATE* pBaseModuleThreadState = pBaseModuleState ->m_thread.GetData();
CHandleMap* pHandleMap = pBaseModuleThreadState->m_pmapHWND; if (pHandleMap)
{
if (pHandleMap->LookupPermanent(m_pFrameWnd->GetSafeHwnd()))
pHandleMap->RemoveHandle(m_pFrameWnd->GetSafeHwnd());
pHandleMap->SetPermanent(m_pFrameWnd->GetSafeHwnd(), m_pFrameWnd);
}
/// create a event to wait for the thread to end 
  m_pGetFrameDataThread = AfxBeginThread((AFX_THREADPROC)_GetFrameDataThread, this,
THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
ASSERT(m_pGetFrameDataThread != NULL);
//..............}在另一工程中调用TEST接口时,tooltip就显示不出来了。??????????????请教!!!!另:::
1。   我在TEST工程去掉了工具栏的CBRS_TOOLTIPS属性,在CView中用了如下消息
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText ),tooltip根本就出不来2。  用CToolTipCtrl m_tips我只能实现整个ToolBar的提示。该如何实现每个按钮的提示阿???

解决方案 »

  1.   

    1,在每一个按钮里,选择属性,在属性里填写提示
    2,自己定义,例如:SetTooltipText(LPCTSTR lpszText, BOOL bActivate)
           {   // We cannot accept NULL pointer
    if (lpszText == NULL) return;

    // Initialize ToolTip
    InitToolTip();

    // If there is no tooltip defined then add it
    if (m_ToolTip.GetToolCount() == 0)
    {
    CRect rectBtn; 
    GetClientRect(rectBtn);
    m_ToolTip.AddTool(this, lpszText, rectBtn, 1);
    }

    // Set text for tooltip
    m_ToolTip.UpdateTipText(lpszText, this, 1);
    m_ToolTip.Activate(bActivate);
    }自己查询相关的函数
      

  2.   

    其实,我在CMainFrame中OnCreate中,已经用到了如下代码:
    //        ID_DRAW_ARROW,ID_DRAW_RECTANGE为工具栏两个按钮的ID.提示已////设置好。 if (m_tips.Create(this))
    {
    // CWnd* pW=GetDlgItem(ID_DRAW_ARROW);//得到窗口指针
    // ASSERT(pW!=NULL);//指针为空
    // m_tips.AddTool(pW,"画3角形");
    // pW=GetDlgItem(ID_DRAW_RECTANGE);//得到窗口指针
    // ASSERT(pW!=NULL);
    // m_tips.AddTool(pW,"画矩形");
                      m_tips.AddTool(this, (LPCTSTR) "TOOLTIP1", CRect(100, 100, 200, 200), ID_DRAW_ARROW);
                      m_tips.AddTool(this, (LPCTSTR) "TOOLTIP2", CRect(100, 100, 200, 200), ID_DRAW_RECTANGE);
               m_tips.Activate(true);
    }  重载PreTranslateMessage函数
               m_tips.RelayEvent(pMsg);
    可是还是达不到效果,出不来tooltip????
      

  3.   

    载消息入口添加:
    ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, OnToolTipText)
    添加想硬汉数
    afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
    函数内容如下: BOOL CMainFrame::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
    {
    ASSERT(pNMHDR->code == TTN_NEEDTEXT);

    TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR;

    // 获得按纽的ID
    UINT nID = pNMHDR->idFrom;

    if (pTTT->uFlags & TTF_IDISHWND)
            nID = ::GetDlgCtrlID((HWND)nID);

    if(nID)
    {
    // 为其指定字符串的资源号和资源的Handle,当然,你也可能直接指定一个字符串,但更好的习惯是将这些字符串保存在资源中。
    pTTT->lpszText = "IDONTKNOWN";//MAKEINTRESOURCE(nID);
    if(nID==ID_USER_ON)
    pTTT->lpszText="画3角形";
    else if(nID==ID_ADDSERVER)
    pTTT->lpszText="画2角形";
    else if(nID==ID_FINDHOSTS)
    pTTT->lpszText="画5角形";

    pTTT->hinst = AfxGetResourceHandle();

    // 将Tip窗口设为最上层窗口
    ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
    SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);

    return TRUE;
    }

    *pResult = 0;

    return FALSE;    // message was handled
    }
      

  4.   

    非常感谢你的帮助〉〉〉〉〉这段代码我也试过了(还要加上EnableToolTips(true);),但仍然有些问题:
      1。  消息响应不了阿,调试不进去哦  2。  我重在了OnSetCursor也是一样,也是如此阿
        if(pWnd!=this)
        {
            TOOLTIPTEXT m_psttt;
            m_psttt.hdr.hwndFrom=m_hWnd;
            m_psttt.hdr.idFrom=pWnd->GetDlgCtrlID();
    UINT dd=m_psttt.hdr.idFrom;
            m_psttt.hdr.code=TTN_NEEDTEXT;
            m_psttt.uFlags= TTF_IDISHWND;
            this->SendMessage(WM_NOTIFY,
            m_psttt.hdr.idFrom,(LPARAM)&m_psttt);
        }
    而且经过测试:m_psttt.hdr.idFrom==ID_VIEW_TOOLBAR,获取的根本不是框架中的工具栏ID?????????