Можно ли добавить пользовательскую всплывающую подсказку в CMFCToolBarComboBoxButton в CMFCToolbar?

Можно ли добавить пользовательскую всплывающую подсказку в CMFCToolBarComboBoxButton в CMFCToolbar?

Теперь я могу использовать текст всплывающей подсказки «по умолчанию», как определено в файле ресурсов, но я не могу найти способ динамически изменять текст всплывающей подсказки в поле со списком на панели инструментов.

Ресурсы :

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

Панель инструментов создается нормально и хорошо отображается; Я «заменяю» кнопку на CMFCToolBarComboBoxButtoncsCombo в OnToolbarReset (обработчик 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 и переопределить два виртуальных метода, которые я смог найти, которые должны делать то, что я ожидал:

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 и получил те же «нерабочие» результаты).

Есть ли какие-то шаги, которые мне не хватает, чтобы сделать это?

Спасибо.

Максимум.


person Max    schedule 04.12.2012    source источник
comment
Я также столкнулся с той же проблемой, связанной с динамическим изменением всплывающих подсказок CMFCToolBarButton. И это не решено до сих пор. Если вы не используете CMFCToolBar и CMFCToolBarButton, я думаю, что это решение: http://www.codeguru.com/cpp/controls/controls/tooltipcontrols/article.php/c2171/Change-tooltips-at-runtime.htm   -  person alexzhang    schedule 08.05.2013


Ответы (3)


Если я понимаю вашу проблему, я считаю, что вы можете получить от CMFCToolBar и переопределить

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

для управления всплывающей подсказкой по запросу.

person darune    schedule 14.12.2016

Любой, кто ищет ответ здесь, я сделал это так. Сделал класс расширения 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. У меня он работает нормально, за исключением того, что описание не отображается.

person Fatema    schedule 14.09.2018
comment
Здравствуйте, добро пожаловать в StackOverflow и спасибо за участие в помощи людям с помощью ваших ответов. Тем не менее, вам не нужно давать никаких объяснений в своих комментариях. Вы можете просто отредактировать ответ и указать подробности там. также взгляните на stackoverflow.com/help/deleted-answers. - person Zeeshan Adil; 14.09.2018

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

это способ сделать это для CMFCToolBar и CMFCToolBarButton

Изменить: вам нужно переопределить GetMessageString в вашем MainFrame. Для каждого идентификатора вы даете описание:

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

Он отображает описание кнопки с идентификатором 1.

person Gener Selibio Gabasa    schedule 18.04.2017
comment
вы не указали где или как переопределить GetMessageString - это не метод CMFCToolBar. - person darune; 03.07.2018