MF C: создание всплывающей подсказки для вкладки в CTabView - PullRequest
0 голосов
/ 14 февраля 2020

Я хочу создать всплывающую подсказку для вкладки на CTabView, которая находится на одной из CSplitterWnd панелей. В этом случае вкладка является CHtmlView. Я положил CToolTipCtrl m_ToolTip в CMainFrame как public. Я создаю его на OnCreate(), затем пытаюсь добавить к нему тестовый текст на OnInitialUpdate() элемента CHtmlView. Но при наведении курсора на вкладку или клиентскую область вкладки подсказка не отображается. Что я делаю неправильно или отсутствует?

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  // ...
  m_ToolTip.Create(this);

  return 0;
}

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
  // create spliter windows - one of which will end up with CTabView 
}

// One of the tabs in the CTabView is based on CHtmlView
void CMyHtmlView::OnInitialUpdate()
{
  __super::OnInitialUpdate();

  CToolTipCtrl &tooltip=((CMainFrame*) AfxGetMainWnd())->m_ToolTip;
  tooltip.AddTool(this, _T("Test Tooltip"));
  tooltip.Activate(TRUE);
}

Отказавшись от вышесказанного, я реализовал предложение на стр. 941-942 в книге Программирование Windows с помощью MF C Второе издание наследовать от CToolTipCtrl и реализовывать новые функции, использующие TTF_SUBCLASS. Я попробовал это в CMyTabView на клиентской области вкладок. Это работает с правками и расширенными представлениями, но не с представлением HTML. В смысле, я имею в виду, это работает, может быть, дважды, а затем снова не подходит. Вот эта часть:

int CMyTabView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if (CTabView::OnCreate(lpCreateStruct) == -1)
    return -1;

  AddView(RUNTIME_CLASS(CMyEditView), _T("Tab1"));
  AddView(RUNTIME_CLASS(CMyRichView), _T("Tab2"));
  AddView(RUNTIME_CLASS(CMyHtmlView), _T("Tab3"));

  m_ToolTip.Create(this, TTS_ALWAYSTIP);

  CMFCTabCtrl &tabctrl=GetTabControl();
  for (int i=0; i < tabctrl.GetTabsNum(); ++i) {
    m_ToolTip.AddWindowTool(tabctrl.GetTabWnd(i), _T("Test Tool Tip"));
  }

  return 0;
}

Не работал на HTML Представление было хорошо, потому что я действительно просто хочу его на вкладке. Поэтому я изменил его и избавился от всего вышеперечисленного (кроме .Create) и добавил:

void CMyTabView::OnInitialUpdate()
{
  CTabView::OnInitialUpdate();

  CMFCTabCtrl &tabctrl=GetTabControl();
  CRect rc;
  tabctrl.GetTabsRect(rc);
  if (!rc.IsRectEmpty()) {
    m_ToolTip.AddRectTool(&tabctrl, _T("test tip"), &rc, (UINT_PTR) tabctrl.GetSafeHwnd());
  }
}

Но это не работает. Он также пытался использовать this, но все равно не работал. Так что, пока что-то работает, все еще не получается заставить работать на вкладках? Есть идеи?

...