如何在MFC中手动显示CToolTipCtrl控件
解决MFC中手动触发CToolTipCtrl显示的问题
方法一:使用跟踪模式(推荐)
CToolTipCtrl支持跟踪模式,通过发送特定消息可手动控制提示框的显示与位置,无需依赖鼠标事件。
- 先完成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; }
- 在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)); }
- 手动关闭提示框(比如鼠标点击其他区域时):
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
相关产品推荐
相关产品推荐

