CToolTipCtrl/CMFCToolTipCtrl在组合框中无法正常工作的问题咨询
组合框无法使用标准工具提示方法的解决办法
按照MFC官方文档的标准方式添加工具提示时,在组合框(ComboBox)上会失效,代码示例如下:
pToolTip->AddTool(pControl,...); ... BOOL ...::PreTranslateMessage(..) { ... pToolTip->RelayEvent(..); ... }
失效原因
组合框是复合控件,内部包含编辑框(Edit)和下拉列表框(ListBox)两个子控件。鼠标事件实际由这些子控件接收,而默认仅给组合框本身注册工具提示的话,工具提示无法捕获到子控件的鼠标消息,导致提示不显示。
解决方案
需要给组合框的所有子控件也注册工具提示,并确保子控件的消息能被工具提示接收:
初始化工具提示时,同时注册组合框的子控件
在窗口初始化(如OnInitDialog)中,通过COMBOBOXINFO获取组合框的子控件句柄,逐个添加工具提示:// 假设m_toolTip是窗口类中声明的CToolTipCtrl对象 m_toolTip.Create(this); CWnd* pCombo = GetDlgItem(IDC_YOUR_COMBO); // 给组合框本身添加提示 m_toolTip.AddTool(pCombo, _T("组合框整体提示")); // 获取组合框的子控件信息 COMBOBOXINFO cbi = { sizeof(COMBOBOXINFO) }; pCombo->GetComboBoxInfo(&cbi); // 给编辑区子控件添加提示 if (cbi.hwndEdit) m_toolTip.AddTool(CWnd::FromHandle(cbi.hwndEdit), _T("编辑输入区提示")); // 给下拉列表子控件添加提示 if (cbi.hwndList) m_toolTip.AddTool(CWnd::FromHandle(cbi.hwndList), _T("下拉列表区提示")); m_toolTip.Activate(TRUE);确保所有消息都转发给工具提示
修改PreTranslateMessage,直接将所有消息转发给工具提示(RelayEvent会自动过滤未注册控件的消息,无需额外判断):BOOL CYourDialog::PreTranslateMessage(MSG* pMsg) { m_toolTip.RelayEvent(pMsg); return CDialogEx::PreTranslateMessage(pMsg); }
额外说明
如果只需要给组合框的某个区域加提示,比如仅编辑区,可以只注册对应的子控件,无需全部添加。另外,若组合框是下拉式(CBS_DROPDOWN),下拉列表只有在展开时才会显示,此时的提示也会正常触发。
内容的提问来源于stack exchange,提问作者bigZ
相关产品推荐
相关产品推荐

