给CStatic添加工具提示

13

我找不到一个简洁的代码块来向CStatic(和CLed)控件添加/显示工具提示。 显然,标准代码不能应用于此类型的控件。 有人能发布代码片段吗?

6个回答

10

我希望这段代码能够解决你的问题。有一件重要的事情是将CStatic的NOTIFY属性设置为TRUE。

if( !m_ToolTip.Create(this))
{
    TRACE0("Unable to create the ToolTip!");
}
else
{
    CWnd* pWnd = GetDlgItem(IDC_STATIC_MASTER_PWD);
    m_ToolTip.AddTool(pWnd,"Ok");
    m_ToolTip.Activate(TRUE);
}

如果有任何问题,请告诉我。


1
我需要这样做,并且按照m_skipper的答案中描述的实现PreTranslateMessage处理程序才能使其工作。另外,可能需要指出m_ToolTip是一个CToolTipCtrl - dlf

4

我不确定这是否仍然需要,但以下是我用来解决问题的方法:在创建静态标签时,只需将dwStyle添加SS_NOTIFY(或在属性中简单设置“Nofity”为“True”)。 这对我很有效。


这正是我所缺乏的......我已经拥有了RelayEvent位,而且我已经使用控制变量创建了静态文本,因为我需要实时修改它。因此,在属性中将Notify设置为True是一个很容易解决的方法。感谢您花时间发布答案! - El Ronaldo

2
当我在基于对话框自动创建的MFC应用程序中添加CStatic时,工具提示不会显示,直到我在预处理对话框消息中添加RelayEvent。
BOOL CTooltipStaticDlg::PreTranslateMessage(MSG* pMsg)
{
    m_ToolTip.RelayEvent(pMsg); 
    return CDialog::PreTranslateMessage(pMsg);
}

2

我使用这个简单的类成功地实现了多行工具提示:

创建一个用于工具提示的类:

class ToolTip
{
public:
    static HWND CreateToolTip(int toolID, HWND hDlg, UINT id);
};

接下来,实现一个创建工具提示的函数:
HWND ToolTip::CreateToolTip(int toolID, HWND hDlg, UINT id)
{
    if (!toolID || !hDlg || !id)
    {
        return FALSE;
    }

    CString strTTText;
    strTTText.LoadString( id );

    // Get the window handle of the control to attach the TT to.
    HWND hwndTool = ::GetDlgItem(hDlg, toolID);

    // Create the tooltip window
    HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
                              WS_POPUP |TTS_ALWAYSTIP,// | TTS_BALLOON,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              hDlg, NULL, 
                              AfxGetInstanceHandle() , NULL);

   if (!hwndTool || !hwndTip)
   {
       return (HWND)NULL;
   }                              

    // Associate the tooltip with the tool.
    TOOLINFO toolInfo = { 0 };
    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd = hDlg;
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.uId = (UINT_PTR)hwndTool;
    toolInfo.lpszText = (char*)(LPCTSTR)strTTText;
    ::SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);
    ::SendMessageA(hwndTip, TTM_SETMAXTIPWIDTH, 0, 40); // force multi-line

    return hwndTip;
}

在你的 InitDialog 中的某个地方调用它:

CMyDialog::InitDialog()
{
    ToolTip::CreateToolTip( PickAUniqueNumber, m_hWnd, IDS_MY_RESOURCE_STRING );
}

0

我在我的对话框标签上分配了自定义ID IDC_PATH。我需要打开标签的Notify标志(SS_NOTIFY),并且我需要重载CWnd方法OnToolHitTest并处理工具提示命中测试,如下所示:

INT_PTR CPath::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
    INT_PTR r = CWnd::OnToolHitTest(point,pTI);

    this->ClientToScreen(&point);
    CRect rcLbl;
    GetDlgItem(IDC_PATH)->GetWindowRect(&rcLbl);
    if( rcLbl.PtInRect(point) )
    {
        pTI->uFlags |= TTF_IDISHWND;
        pTI->uFlags &= ~TTF_NOTBUTTON;
        pTI->uId = (UINT_PTR)GetDlgItem(IDC_PATH)->m_hWnd;
        return IDC_PATH;
    }

    return r;
}

然后我的对话框开始接收TTN_NEEDTEXT通知,我进行了处理并动态设置了工具提示的文本。

BOOL CPath::OnTtnNeedText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
   UNREFERENCED_PARAMETER(id);

   TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
   UINT_PTR nID = pNMHDR->idFrom;
   BOOL bRet = FALSE;

   if (pTTT->uFlags & TTF_IDISHWND)
   {
      // idFrom is actually the HWND of the tool
      nID = ::GetDlgCtrlID((HWND)nID);
      if(nID == IDC_PATH)
      {
         pTTT->lpszText = (LPSTR)(LPCTSTR)m_FullDestPath;
         bRet = TRUE;
      }
   }

   *pResult = 0;

   return bRet;
}

0

我在对话框中使用这个工作的 MFC 变体作为静态控件的工具提示。静态控件不被指定为窗口,而是作为一个矩形区域来使用工具提示。不需要更多的东西。

// header file
CStatic     m_sc;
CToolTipCtrl m_ttc;

// C++ file
    CDialogA::OnInitDialog()
    {
        if (m_ttc.Create(this))
        {
            CRect Rect;
            m_sc.GetWindowRect(Rect);
            ScreenToClient(Rect);
    
            TTTOOLINFO ti;
            ::ZeroMemory(&ti, sizeof(ti));
            ti.cbSize = sizeof(ti);
            ti.uFlags = TTF_SUBCLASS;
            ti.hwnd = GetSafeHwnd();
            ti.uId = m_sc.GetDlgCtrlID();
            ti.rect = Rect;
            ti.lpszText = _T("Text");
            m_ttc.SendMessage(TTM_ADDTOOL, 0, (LPARAM)&ti);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接