You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MFC中手动显示CToolTipCtrl控件

解决MFC中手动触发CToolTipCtrl显示的问题

方法一:使用跟踪模式(推荐)

CToolTipCtrl支持跟踪模式,通过发送特定消息可手动控制提示框的显示与位置,无需依赖鼠标事件。

  1. 先完成CToolTipCtrl的初始化(示例在OnInitDialog中):
BOOL CYourDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    m_tooltip.Create(this);
    m_toolInfo.cbSize = sizeof(TOOLINFO);
    m_toolInfo.uFlags = TTF_IDISHWND | TTF_TRACK; // 启用跟踪模式
    m_toolInfo.hwnd = GetDlgItem(IDC_BUTTON_A)->m_hWnd;
    m_toolInfo.uId = (UINT_PTR)GetDlgItem(IDC_BUTTON_A)->m_hWnd;
    m_toolInfo.lpszText = _T("ButtonA的提示文本");
    m_tooltip.AddTool(&m_toolInfo);

    return TRUE;
}
  1. 在ButtonB的点击事件中触发提示:
void CYourDlg::OnBnClickedButtonB()
{
    // 获取ButtonA的屏幕坐标,确定提示框位置
    CRect rcBtn;
    GetDlgItem(IDC_BUTTON_A)->GetWindowRect(&rcBtn);
    // 激活跟踪模式并显示提示
    m_tooltip.SendMessage(TTM_TRACKACTIVATE, TRUE, (LPARAM)&m_toolInfo);
    // 设置提示框在按钮下方居中显示
    m_tooltip.SendMessage(TTM_TRACKPOSITION, 0, MAKELPARAM(rcBtn.CenterPoint().x, rcBtn.bottom + 10));
}
  1. 手动关闭提示框(比如鼠标点击其他区域时):
void CYourDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    m_tooltip.SendMessage(TTM_TRACKACTIVATE, FALSE, (LPARAM)&m_toolInfo);
    CDialogEx::OnLButtonDown(nFlags, point);
}

方法二:模拟鼠标悬停消息

构造WM_MOUSEMOVE消息并传递给PreTranslateMessage,让CToolTipCtrl误以为鼠标停在ButtonA上。此方法依赖tooltip内部定时器,稳定性稍弱:

void CYourDlg::OnBnClickedButtonB()
{
    CRect rcBtn;
    GetDlgItem(IDC_BUTTON_A)->GetWindowRect(&rcBtn);
    // 取按钮内部一个坐标点
    CPoint pt(rcBtn.left + 10, rcBtn.top + 10);

    MSG msg = {0};
    msg.hwnd = GetDlgItem(IDC_BUTTON_A)->m_hWnd;
    msg.message = WM_MOUSEMOVE;
    msg.wParam = 0;
    msg.lParam = MAKELPARAM(pt.x, pt.y);
    msg.time = GetTickCount();
    msg.pt = pt;

    // 让对话框的PreTranslateMessage处理消息,触发tooltip显示
    PreTranslateMessage(&msg);
}

注意事项

  • 跟踪模式下,TOOLINFO需声明为类成员变量,避免局部变量销毁引发问题。
  • 跟踪模式的提示框不会自动关闭,必须手动发送TTM_TRACKACTIVATE消息关闭。
  • 合理设置CToolTipCtrl的SetDelayTime,避免影响手动触发的响应速度。

内容的提问来源于stack exchange,提问作者ssroreo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:05:44