Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜ΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ руководство ΠΏΠΎ написанию Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… подсказок». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 4

Автор Π ΠΎΠ΄ΠΆΠ΅Ρ€ Π”ΠΆΠ΅ΠΊ

   ASSERT(strTip.GetLength() < sizeof(pTTT->szText));

   ::strcpy(pTTT->szText, strTip);

   // Set the text color to same color as circle

   m_ToolTip.SendMessage(TTM_SETTIPTEXTCOLOR, Color, L);

  } else {

   pTTT->szText[0] = 0;

  }

  bHandledNotify = TRUE;

 }

 return bHandledNotify;

}


BOOL CDTDemoView::PreTranslateMessage(MSG* pMsg) {

 if (::IsWindow(m_ToolTip.m_hWnd) && pMsg->hwnd == m_hWnd) {

  switch(pMsg->message) {

  case WM_LBUTTONDOWN:

  case WM_MOUSEMOVE:

  case WM_LBUTTONUP:

  case WM_RBUTTONDOWN:

  case WM_MBUTTONDOWN:

  case WM_RBUTTONUP:

  case WM_MBUTTONUP:

   m_ToolTip.RelayEvent(pMsg);

   break;

  }

 }

 return CView::PreTranslateMessage(pMsg);

}


void CDTDemoView::OnMouseMove(UINT nFlags, CPoint point) {

 if (::IsWindow(m_ToolTip.m_hWnd)) {

  const CCircle* pCircleHit = HitTest(point);

  if (!pCircleHit || pCircleHit != m_pCircleHit) {

   // Activate() скрываСт подсказку.

   m_ToolTip.Activate(FALSE);

  }

  if (pCircleHit) {

   m_ToolTip.Activate(TRUE);

   m_pCircleHit = pCircleHit;

  }

 }

 CView::OnMouseMove(nFlags, point);

}

CDTDemoView::OnInitialUpdate создаСт DataTip ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΊ использованию. Π― Π²Ρ‹Π·Ρ‹Π²Π°ΡŽ m_ToolTip.Create ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽ Π΅ΠΉ TTS_ALWAYSTIP, Ρ‡Ρ‚ΠΎΠ±Ρ‹ DataTip показывался нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π—Π°Ρ‚Π΅ΠΌ я Π²Ρ‹Π·Ρ‹Π²Π°ΡŽ m_ToolTip.AddTool ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽ Π΅ΠΉ CDTDemoView, ΠΊΠ°ΠΊ ΠΎΠΊΠ½ΠΎ, содСрТащСС инструмСнт. Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ послСдниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² CToolTipCtrl::AddTool ΠΈΠΌΠ΅ΡŽΡ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LPSTR_TEXTCALLBACK ΠΊΠ°ΠΊ тСкст подсказки, NULL для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° lpRectTool ΠΈ 0 для nIDTool), всС ΠΎΠΊΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ инструмСнтом ΠΈ Π½ΠΎΡ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ сообщСниС TTN_NEEDTEXT Π±ΡƒΠ΄Π΅Ρ‚ послано CDTDemoView. Π­Ρ‚Π° сообщСниС позволяСт ΠΌΠ½Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ тСкст подсказки Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CDTDemoView::OnToolTipNeedText.

Π― ΠΏΠΎΡΡ‹Π»Π°ΡŽ нСсколько сообщСний элСмСнту DataTip, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ использованию. TTM_SETMAXTIPWIDTH посылаСтся с Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ большим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ (SHRT_MAX) Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ lParam для установки максимальной ΡˆΠΈΡ€ΠΈΠ½Ρ‹ подсказки.[2] Π­Ρ‚ΠΎ заставляСт элСмСнт ToolTip Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ символы Π½ΠΎΠ²ΠΎΠΉ строки Π² строкС подсказки (новая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ IE 4.0 Common Controls DLL). Π—Π°Ρ‚Π΅ΠΌ я Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π° ΠΏΠΎΡΡ‹Π»Π°ΡŽ сообщСниС TTM_SETDELAYTIME.[3] Π’ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ wParam ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TTDT_AUTOPOP, для установки Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ToolTip исчСзнСт. ВрСмя инициализируСтся Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ lParam Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ большим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ (SHRT_MAX), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ автоисчСзаниС подсказок.[4] Π’Π΅ΠΏΠ΅Ρ€ΡŒ я ΠΌΠΎΠ³Ρƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… врСмя ΠΆΠΈΠ·Π½ΠΈ. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· Π² wParam пСрСдаСтся TTDT_INITIAL, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ остановки курсора ΠΌΡ‹ΡˆΠΈ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ появлСниСм подсказки. Π­Ρ‚ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» устанавливаСтся Π² 200 миллисСкунд, поэтому подсказка появляСтся довольно быстро. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, TTDT_RESHOW устанавливаСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΌΠ΅ΠΆΠ΄Ρƒ появлСниСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ подсказки ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ курсора Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΡ€ΡƒΠ³. Π­Ρ‚ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Ρ‚Π°ΠΊΠΆΠ΅ установлСн Π² 200 миллисСкунд. ΠŸΠΎΡ‡Π΅ΠΌΡƒ я Π½Π΅ использовал CToolTipCtrl::SetDelayTime для установки ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ²? К соТалСнию, CToolTipCtrl::SetDelayTime позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» для TTDT_AUTOMATIC.

Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CDTDemoView::OnDraw ΠΈ CDTDemoView::HitTest довольно ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹. CDTDemoView::OnDraw ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ массиву ΠΊΡ€ΡƒΠ³ΠΎΠ², вызывая для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° CCircle::Draw. Ѐункция CDTDemoView::HitTest провСряСт, находится Π»ΠΈ пСрСданная Π΅ΠΌΡƒ Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π°Π΄ ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΡ€ΡƒΠ³ΠΎΠΌ, вызывая для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° Π² массивС CCircle::HitTest. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эта ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° выполняСтся Π² порядкС, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌΡƒ Π² CDTDemoView::OnDraw. Π­Ρ‚ΠΎ дСлаСтся для учитывания z-сортировки (z-order) ΠΊΡ€ΡƒΠ³ΠΎΠ². НапримСр, Ссли ΠΊΡ€ΡƒΠ³ Π‘ нарисован ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΊΡ€ΡƒΠ³Π° A, Ρ‚ΠΎΠ³Π΄Π° сначала Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Π²Π°Ρ‚ΡŒΡΡ функция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΡ€ΡƒΠ³Π° Π‘.

Ѐункция CDTDemoView::OnToolTipNeedText ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΎΡ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ сообщСния TTN_NEEDTEXT ΠΎΡ‚ элСмСнта, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ пСрСмСнная m_ToolTip. Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½Π°Π΄ ΠΊΠ°ΠΊΠΈΠΌ ΠΊΡ€ΡƒΠ³ΠΎΠΌ находится курсор ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ тСкст подсказки. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ курсора ΠΌΡ‹ΡˆΠΈ ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ систСму ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ клиСнтской части прСдставлСния. Если этого Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΡ€ΠΎΠΏΠ°Π΄ΡƒΡ‚ подсказки Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½ΠΎΡ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ сообщСниС TTN_NEEDTEXT ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ панСлью инструмСнтов. CDTDemoView::OnToolTipNeedText автоматичСски Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ всС сообщСния TTN_NEEDTEXT ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅ прСдставлСния. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ bHandledNotify ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π»ΠΈ сообщСниС ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ дальшС Π³Π»Π°Π²Π½ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ. Если курсор находится Π² клиСнтской части ΠΎΠΊΠ½Π°, я ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽ Π΅Π³ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΡ€ΡƒΠ³Ρƒ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ m_pCircleHit. Π­Ρ‚Π° пСрСмСнная Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CDTDemoView::OnMouseMove. Если курсор ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΡ€ΡƒΠ³ΠΎΠ², я создаю строку подсказки, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π½ΠΎΡˆΡƒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ†Π΅Π½Ρ‚Ρ€Π°, радиус ΠΈ Ρ†Π²Π΅Ρ‚ ΠΊΡ€ΡƒΠ³Π°. Π­Ρ‚Π° строка копируСтся Π² ΠΏΠΎΠ»Π΅ szText ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΉ структуры TOOLTIPTEXT. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, я ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽ Ρ†Π²Π΅Ρ‚ тСкста подсказки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сообщСния TTM_SETTIPTEXTCOLOR.[5] ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ wParam этого сообщСния содСрТит Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° тСкста, ΠΈ устанавливаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚Ρƒ ΠΊΡ€ΡƒΠ³Π° (Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° новая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ IE 4.0 Common Controls DLL). Если курсор Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½ΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΡ€ΡƒΠ³, ΠΏΠΎΠ»Π΅ szText ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΡƒΡΡ‚ΡƒΡŽ строку.

Ѐункция CDTDemoView::PreTranslateMessage рСтранслируСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сообщСния ΠΌΡ‹ΡˆΠΈ элСмСнту DataTip с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CToolTipCtrl::RelayEvent. CDTDemoView::PreTranslateMessage вызываСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния, посылаСмого ΠΎΠΊΠ½Ρƒ. ΠŸΡ€ΠΎΡ‰Π΅ всСго Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ CToolTipCtrl::RelayEvent здСсь, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² этом случаС ΠΌΠ½Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния ΠΌΡ‹ΡˆΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ этих сообщСний элСмСнту DataTip. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° подсказок классом CWnd.

Ѐункция CDTDemoView::OnMouseMove прячСт ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ подсказку Π² зависимости ΠΎΡ‚ принадлСТности ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ курсора ΠΊΠ°ΠΊΠΎΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΡ€ΡƒΠ³Ρƒ, Ρ‡Ρ‚ΠΎ опрСдСляСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ HitTest. Если курсор ΠΌΡ‹ΡˆΠΈ Π½Π΅ находится Π½Π°Π΄ ΠΊΡ€ΡƒΠ³ΠΎΠΌ Π»ΠΈΠ±ΠΎ Ссли ΠΎΠ½ находится Π½Π΅ Π½Π°Π΄ Ρ‚Π΅ΠΌ ΠΊΡ€ΡƒΠ³ΠΎΠΌ, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ находился Π²ΠΎ врСмя послСднСго ΠΏΠΎΠΊΠ°Π·Π° подсказки, Ρ‚ΠΎ CDTDemoView::OnMouseMove прячСт подсказку Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ m_ToolTip.Activate(FALSE). Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FALSE ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ элСмСнт DataTip Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ спрятан. Π”Π°Π»Π΅Π΅, Ссли курсор находится Π½Π°Π΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΡ€ΡƒΠ³ΠΎΠΌ, подсказка снова выводится Π½Π° экран Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ m_ToolTip.Activate(TRUE), Π° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ CDTDemoView::m_pCircleHit заносится ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΡ€ΡƒΠ³. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ курсора с ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ, я Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°ΡŽ подсказку ΠΈ сразу Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽ Π΅Π΅. Π­Ρ‚ΠΎ дСлаСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ элСмСнт DataTip запросил Π½ΠΎΠ²Ρ‹ΠΉ тСкст подсказки Ρ‡Π΅Ρ€Π΅Π· сообщСниС TTN_NEEDTEXT, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ подсказку Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΊΡ€ΡƒΠ³Π΅. Π’ IE 4.0 для скрытия подсказки ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ сообщСниС TTM_POP, Π½ΠΎ это сообщСниС отсутствовало Π² Ρ‚ΠΎΠΉ вСрсии Ρ„Π°ΠΉΠ»Π° commctrl.h, которая Ρƒ мСня Π±Ρ‹Π»Π°.

Подсказки домашнСго изготовлСния: TitleTips

ДСмонстрационный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ TTDemo

ДСмонстрационный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ TTDemoDelay

TitleTip – это Π²ΠΈΠ΄ подсказок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ строки Π² списковых элСмСнтах управлСния. НапримСр, Ρ‚Π°ΠΊΠΈΠ΅ подсказки ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΎΠΊΠ½Π΅ Project Workspace срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Visual C++. Если имя класса Π½Π΅ помСщаСтся Π² ΠΎΠΊΠ½ΠΎ Project Workspace, появляСтся подсказка, которая ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ тСкст Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. Π­Ρ‚ΠΎ избавляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΡ‚ нСобходимости Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΎΠΊΠ½Π°. Π― написал Π΄Π΅ΠΌΠΎ-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ TitleTips для элСмСнта управлСния "список". Однако Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сходныС ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ для добавлСния этого Π²ΠΈΠ΄Π° подсказок ΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ элСмСнтам управлСния. Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я написал, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ элСмСнтами "список", Ρ‚Π°ΠΊ ΠΈ со списками с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовкой (owner-draw listboxes). Π― Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ» ΠΎΠ±Π° списка названиями ΠΌΠΎΠΈΡ… Π»ΡŽΠ±ΠΈΠΌΡ‹Ρ… ΠΊΠ½ΠΈΠ³ ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ (см. рис.9).

Рис.9. ДСмонстрация элСмСнтов TitleTip

Π’Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΠΏΠΎΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΠ΅Ρ‚Π΅ΡΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ я Π½Π΅ использовал Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовки подсказок (появившСйся Π² IE 4.0 Common Controls DLL) для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ TitleTips. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡˆΠΈΡ€ΠΈΠ½Π° ΠΎΠΊΠ½Π° подсказки рассчитываСтся исходя ΠΈΠ· ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ части строки Π² спискС. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρƒ вас Π½Π΅Ρ‚ прямого контроля Π½Π°Π΄ ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ элСмСнта ToolTip. Π­Ρ‚ΠΎ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ подсказок для элСмСнтов "список" с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовкой, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ вывСсти Π½Π° экран Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ тСкст. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, я Π΄ΡƒΠΌΠ°ΡŽ, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ подсказки с нуля, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всСгда ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ стандартная рСализация подсказок Π½Π΅ обСспСчиваСт Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Допустим, Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ Π³ΠΎΠ²ΠΎΡ€ΡΡ‰ΡƒΡŽ подсказку.

На рис.10 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° классов, которая ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ классами нашСго ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Класс CListBox – это стандартный класс MFC, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инкапсулируСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ стандартного элСмСнта управлСния "список". Класс CTitleTipListBox унаслСдован ΠΎΡ‚ класса CListBox ΠΈ отвСтствСнСн Π·Π° созданиС ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ подсказками для списка. CTitleTipListBox ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Ссли Π²Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ элСмСнт "список". Класс CTitleTip унаслСдован ΠΎΡ‚ CWnd ΠΈ прСдставляСт элСмСнт ToolTip. Класс CODListBox – это элСмСнт "список" с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовкой, ΠΎΠ½ унаслСдован ΠΎΡ‚ CTitleTipListBox. Для создания элСмСнта "список" с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовкой Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ класс ΠΎΡ‚ CTitleTipListBox ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CTitleTipListBox::GetIdealItemRect. ΠœΡ‹ обсудим Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CTitleTipListBox::GetIdealItemRect ΠΏΠΎΠ·ΠΆΠ΅.