【问题标题】:Is it possible to add a custom tooltip on a CMFCToolBarComboBoxButton in a CMFCToolbar?是否可以在 CMFCToolbar 中的 CMFCToolBarComboBoxButton 上添加自定义工具提示?
【发布时间】:2012-11-22 12:43:38
【问题描述】:

是否可以在 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 中的 CMFCToolBarComboBoxButtoncsCombo ( AFX_WM_RESETTOOLBAR 的处理程序)“替换”按钮

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 个虚方法永远不会被调用;好吧,它们在打开应用程序和关闭应用程序时被调用;但当用户将鼠标移动/悬停在工具栏中的组合框顶部时,应用程序正常运行时永远不会。

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

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

我是否缺少一些步骤才能做到这一点?

谢谢。

最大。

【问题讨论】:

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


【解决方案1】:

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

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

按需控制工具提示。

【讨论】:

    【解决方案2】:

    任何在这里寻找答案的人我都是这样做的。 做了一个扩展类 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 函数添加资源时。 它对我来说很好用,只是没有显示描述。

    【讨论】:

    • 您好,欢迎来到 StackOverflow,感谢您参与帮助人们完成您的回答。但是,您不需要在 cmets 中提供任何解释。您可以简单地编辑答案并在那里提供详细信息。另外,看看stackoverflow.com/help/deleted-answers
    【解决方案3】:
    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 的按钮的描述。

    【讨论】:

    • 您没有指定在哪里或如何覆盖 GetMessageString - 它不是 CMFCToolBar 的方法。
    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 2020-07-29
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多