是否可以在CMFCToolbar中的CMFCToolBarComboBoxButton上添加自定义工具提示?

时间:2012-12-04 19:37:50

标签: visual-studio-2008 mfc tooltip mfc-feature-pack

是否可以在CMFCToolbar中的CMFCToolBarComboBoxButton上添加自定义工具提示?

我现在可以使用资源文件中定义的“默认”工具提示文本,但我找不到能够动态更改工具栏中组合框上的工具提示文本的方法。

资源:

IDR_TOOLBAR1 TOOLBAR 16, 15
BEGIN
  BUTTON      ID_BUTTON32771
  BUTTON      ID_BUTTON32772
  BUTTON      ID_BUTTON32773
END

STRINGTABLE
BEGIN
  ID_BUTTON32771 "Button 1\nButton 1"
  ID_BUTTON32772 "Button 2\nButton 2"
  ID_BUTTON32773 "Button 3\nButton 3"
END

工具栏正常创建,显示效果很好;我在OnToolbarReset(AFX_WM_RESETTOOLBAR的处理程序)中使用CMFCToolBarComboBoxButtoncsCombo“替换”按钮

LRESULT CMainFrame::OnToolbarReset(WPARAM wp,LPARAM)
{
  UINT uiToolBarId = (UINT) wp;
  if (uiToolBarId == IDR_TOOLBAR1 )
  {
    CMFCToolBarComboBoxButtoncsCombo(ID_BUTTON32772, GetCmdMgr()->GetCmdImage(ID_BUTTON32772, FALSE), CBS_DROPDOWNLIST);

    m_MyToolbar.ReplaceButton(ID_BUTTON32772, csCombo);
    m_MyToolbar.AddItem( _T("un") );
    m_MyToolbar.AddItem( _T("deux") );
    m_MyToolbar.AddItem( _T("trois") );

  }

  return 0;
}

这项工作正常,按钮被组合框替换,显示默认的工具提示文本。

现在,我希望能够动态更改工具提示文本。

我试图在主框架中处理TTN_NEEDTEXT(以及TTN_NEEDTEXTA和TTN_NEEDTEXTW)(甚至在我的派生工具栏类中),但是没有为工具栏调用它。

我尝试派生自己的CMFCToolBarComboBoxButton类并覆盖我能找到的2个应该按照我的预期做的虚拟方法:

class MyComboBox : public CMFCToolBarComboBoxButton
{
public:
  MyComboBox ();
  MyComboBox (UINT uiID, int iImage, DWORD dwStyle = CBS_DROPDOWNLIST, int iWidth = 0);

  virtual BOOL OnGetCustomToolTipText(CString& );
  virtual BOOL OnUpdateToolTip(CWnd* , int , CToolTipCtrl& , CString& );

  virtual ~MyComboBox ();
  DECLARE_SERIAL(MyComboBox )

};

IMPLEMENT_SERIAL(MyComboBox , CMFCToolBarComboBoxButton,0)

MyComboBox ::MyComboBox (UINT uiID, int iImage, DWORD dwStyle , int iWidth  ) : CMFCToolBarComboBoxButton(uiID, iImage,dwStyle, iWidth )
{

}

MyComboBox ::MyComboBox ()
{

}

MyComboBox ::~MyComboBox ()
{
}

BOOL MyComboBox ::OnGetCustomToolTipText(CString& strToolTip) 
{ 
    strToolTip = "bonjour";
    return TRUE;
}

BOOL MyComboBox ::OnUpdateToolTip(CWnd* /*pWndParent*/, int /*iButtonIndex*/, CToolTipCtrl& /*wndToolTip*/, CString& str) 
{ 
  str = "allo";
  return TRUE; 
}

永远不会调用2个虚拟方法;好吧,在打开应用程序和关闭应用程序时会调用它们;但是当用户将鼠标移动/悬停在工具栏中的组合框顶部时,应用程序才能正常运行。

我试着通过调用或不启用InitTooltipManager来查看工具提示管理器(CTooltipManager)并启用或不启用工具提示管理器。

(我很快用VS2012尝试了这个,我得到了相同的“不工作”结果)。

我是否缺少一些可以做到的步骤?

感谢。

最大

3 个答案:

答案 0 :(得分:1)

virtual BOOL GetToolbarButtonToolTipText(CMFCToolBarButton*/*pButton*/, CString&/*strTTText*/);
virtual void GetMessageString(UINT nID, CString& rMessage) const;

是CMFCToolBar和CMFCToolBarButton的方法

编辑:您需要在MainFrame中覆盖GetMessageString。 对于每个ID,您都会给出描述:

void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const 
{
    switch (nID)
    {
        case 1:
        rMessage = "Hello World";
        break;
    }
} 

显示ID为1的按钮的说明。

答案 1 :(得分:1)

在这里寻找答案的任何人我都是这样做的。 制作了扩展类CMFCToolBarEx并编写了类似的函数

   BOOL CMFCToolBarEx::OnNeedTipText(UINT /*id*/, NMHDR* pNMH, LRESULT* /*pResult*/)
{
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMH;
    CString strTip = _T("");

    CPoint point;
    ::GetCursorPos(&point);
    ScreenToClient(&point);
    INT_PTR nHit = ((CMFCToolBar*)this)->HitTest(point);

    if(nHit == -1)
        return FALSE;

    CMFCToolBarButton* pButton = GetButton((int)nHit);
    strTip = pButton->m_strText;
    _tcscpy(pTTT->lpszText , strTip.GetBuffer(0));

    return TRUE;
}

和消息映射ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, &CMFCToolBarEx::OnNeedTipText)

这是您自己添加按钮而不是通过InsertButton函数添加资源的时候。 除了没有显示说明外,它对我来说还不错。

答案 2 :(得分:0)

如果我了解您的问题,我相信您可以从CMFCToolBar派生并覆盖

virtual BOOL OnUserToolTip(CMFCToolBarButton* pButton, CString& strTTText) const 

按需控制工具提示。