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

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

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

Рис.10. Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° классов для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования элСмСнтов ToolTip

Класс CTitleTip прСдставляСт ΠΎΠΊΠ½ΠΎ подсказки (см. рис.11). Π’ статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CTitleTip::m_pszWndClass хранится зарСгистрированноС имя класса ΠΎΠΊΠ½Π°. Имя хранится Π² статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ класс ΠΎΠΊΠ½Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для всСх экзСмпляров CTitleTip. CTitleTip::m_nItemIndex – это индСкс строки Π² спискС, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ выводится подсказка. Π­Ρ‚Π° пСрСмСнная ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы CTitleTip::m_nNoIndex, Ссли подсказка Π½Π΅ выводится Π½ΠΈ для ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· строк. CTitleTip::m_pListBox Ρ…Ρ€Π°Π½ΠΈΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ элСмСнта TitleTip. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ элСмСнтом "список", Ρ‡Ρ‚ΠΎΠ±Ρ‹ я смог Π²Π·ΡΡ‚ΡŒ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для подсказки.

Рис.11. CTitleTip

/////////////////////////////////////////////////////////////////////////////

// CTitleTip window

class CTitleTip : public CWnd {

public:

 CTitleTip();

 virtual BOOL Create(CListBox* pParentWnd);

 virtual void Show(CRect DisplayRect, int nItemIndex);

 virtual void Hide();

// Overrides

 // ClassWizard generated virtual function overrides

 //{{AFX_VIRTUAL(CTitleTip)

 //}}AFX_VIRTUAL

 // Implementation

public:

 virtual ~CTitleTip();

protected:

 const int m_nNoIndex; // ΠŸΡƒΡΡ‚ΠΎΠΉ индСкс

 static LPCSTR m_pszWndClass; // Имя зарСгистрированного класса

 int m_nItemIndex; // ИндСкс строки, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ показываСтся подсказка

 CListBox* m_pListBox; // Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ

 BOOL IsListBoxOwnerDraw();

 // Generated message map functions

protected:

 //{{AFX_MSG(CTitleTip)

 afx_msg void OnPaint();

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()

};


/////////////////////////////////////////////////////////////////////////////

// TitleTip.cpp : implementation file //

#include "stdafx.h"

#include "TitleTip.h"


#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif


/////////////////////////////////////////////////////////////////////////////

// CTitleTip

LPCSTR CTitleTip::m_pszWndClass = NULL;

CTitleTip::CTitleTip() : m_nNoIndex(-1) {

 // Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ класс ΠΎΠΊΠ½Π°, Ссли ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ зарСгистрирован

 // Π΄Ρ€ΡƒΠ³ΠΈΠΌ экзСмпляром CTitleTip.

 if (m_pszWndClass == NULL) {

  m_pszWndClass = AfxRegisterWndClass(CS_SAVEBITS | CS_HREDRAW | CS_VREDRAW);

 }

 m_nItemIndex = m_nNoIndex;

 m_pListBox = NULL;

}


CTitleTip::~CTitleTip() { }


BOOL CTitleTip::Create(CListBox* pParentWnd) {

 ASSERT_VALID(pParentWnd);

 m_pListBox = pParentWnd;

 // НС Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°ΠΌΠΊΡƒ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… элСмСнтов "список", Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ

 // строки с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовкой Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Ρ€Π°ΠΌΠΊΡƒ автоматичСски.

 DWORD dwStyle = WS_POPUP;

 if (!IsListBoxOwnerDraw()) {

  dwStyle |= WS_BORDER;

 }

 return CreateEx(0, m_pszWndClass, NULL, dwStyle, 0, 0, 0, 0, pParentWnd->GetSafeHwnd(), NULL, NULL);

}


BOOL CTitleTip::IsListBoxOwnerDraw() {

 ASSERT_VALID(m_pListBox);

 DWORD dwStyle = m_pListBox->GetStyle();

 return (dwStyle & LBS_OWNERDRAWFIXED) || (dwStyle & LBS_OWNERDRAWVARIABLE);

}


void CTitleTip::Show(CRect DisplayRect, int nItemIndex) {

 ASSERT_VALID(m_pListBox);

 ASSERT(nItemIndex < m_pListBox->GetCount());

 ASSERT(nItemIndex >= 0);

 ASSERT(::IsWindow(m_hWnd));

 ASSERT(!DisplayRect.IsRectEmpty());

 // ΠŸΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ для обновлСния, Ссли новая строка.

 if (m_nItemIndex != nItemIndex) {

  m_nItemIndex = nItemIndex;

  InvalidateRect(NULL);

 }

 // Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΠΊΠ½Π°.

 CRect WindowRect;

 GetWindowRect(WindowRect);

 int nSWPFlags = SWP_SHOWWINDOW | SWP_NOACTIVATE;

 if (WindowRect == DisplayRect) {

  nSWPFlags |= SWP_NOMOVE | SWP_NOSIZE;

 }

 VERIFY(SetWindowPos(&wndTopMost, DisplayRect.left, DisplayRect.top, DisplayRect.Width(), DisplayRect.Height(), nSWPFlags));

}


void CTitleTip::Hide() {

 ASSERT(::IsWindow(m_hWnd));

 ShowWindow(SW_HIDE);

}


BEGIN_MESSAGE_MAP(CTitleTip, CWnd)

 //{{AFX_MSG_MAP(CTitleTip)

 ON_WM_PAINT()

 //}}AFX_MSG_MAP

END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////

// CTitleTip message handlers

void CTitleTip::OnPaint() {

 ASSERT(m_nItemIndex != m_nNoIndex);

 CPaintDC DC(this);

 int nSavedDC = DC.SaveDC();

 CRect ClientRect;

 GetClientRect(ClientRect);

 if (IsListBoxOwnerDraw()) {

  // Π”ΠΎΠ²Π΅Ρ€ΠΈΠΌ рисованиС элСмСнту "список".

  DRAWITEMSTRUCT DrawItemStruct;

  DrawItemStruct.CtlType = ODT_LISTBOX;

  DrawItemStruct.CtlID = m_pListBox->GetDlgCtrlID();

  DrawItemStruct.itemID = m_nItemIndex;

  DrawItemStruct.itemAction = ODA_DRAWENTIRE;

  DrawItemStruct.hwndItem = m_pListBox->GetSafeHwnd();

  DrawItemStruct.hDC = DC.GetSafeHdc();

  DrawItemStruct.rcItem = ClientRect;

  DrawItemStruct.itemData = m_pListBox->GetItemData(m_nItemIndex);

  DrawItemStruct.itemState = (m_pListBox->GetSel(m_nItemIndex) > 0 ? ODS_SELECTED : 0);

  if (m_pListBox->GetStyle() & LBS_MULTIPLESEL) {

   if (m_pListBox->GetCaretIndex() == m_nItemIndex) {

    DrawItemStruct.itemState |= ODS_FOCUS;

   }

  } else {

   DrawItemStruct.itemState |= ODS_FOCUS;

  }

  m_pListBox->DrawItem(&DrawItemStruct);

 } else {

  // РисуСм ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ

  CFont* pFont = m_pListBox->GetFont();

  ASSERT_VALID(pFont);

  DC.SelectObject(pFont);

  COLORREF clrBackground = RGB(255, 255, 255);

  if (m_pListBox->GetSel(m_nItemIndex) > 0) {

   DC.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));

   clrBackground = ::GetSysColor(COLOR_HIGHLIGHT);

  }

  // РисуСм Ρ„ΠΎΠ½

  DC.FillSolidRect(ClientRect, clrBackground);

  // РисуСм тСкст строки

  CString strItem;

  m_pListBox->GetText(m_nItemIndex, strItem);

  ASSERT(!strItem.IsEmpty());

  DC.SetBkMode(TRANSPARENT);

  DC.TextOut(1, –1, strItem);

 }

 DC.RestoreDC(nSavedDC);

 // НС Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ CWnd::OnPaint() для сообщСний отрисовки

}

CTitleTip::CTitleTip рСгистрируСт класс ΠΎΠΊΠ½Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AfxRegisterWndClass ΠΈ сохраняСт имя класса Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CTitleTip::m_pszWndClass. Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ AfxRegisterWndClass, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ класс ΠΎΠΊΠ½Π° с установлСнным стилСм CS_SAVEBITS. Π€Π»Π°Π³ CS_SAVEBITS ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ – Windows сохраняСт кусок ΠΎΠΊΠ½Π°, заслонСнного элСмСнтом TitleTip, ΠΊΠ°ΠΊ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, этому ΠΎΠΊΠ½Ρƒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сообщСниС WM_PAINT, ΠΊΠΎΠ³Π΄Π° подсказка убираСтся с экрана. CTitleTip::Create создаСт подсказку Π² Π²ΠΈΠ΄Π΅ popup-ΠΎΠΊΠ½Π°. К ΠΎΠΊΠ½Ρƒ подсказки Ρ€Π°ΠΌΠΊΠ° добавляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли элСмСнт "список" являСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Windows автоматичСски добавляСт Ρ€Π°ΠΌΠΊΡƒ ΠΊ элСмСнтам "список" с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовкой ΠΏΠ΅Ρ€Π΅Π΄ посылкой сообщСния WM_DRAWITEM. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CTitleTip::m_pszWndClass пСрСдаСтся Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ класса ΠΎΠΊΠ½Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CWnd::CreateEx. CTitleTip::IsListBoxOwnerDraw Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE, Ссли Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт "список" являСтся элСмСнтом с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовкой. Ѐункция ΡƒΠ·Π½Π°Π΅Ρ‚ ΠΎΠ± этом ΠΏΠΎ ΡΡ‚ΠΈΠ»ΡŽ элСмСнта "список".

Ѐункция CTitleTip::Show ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΏΠΎΠΊΠ°Π· элСмСнта TitleTip. Π•Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ DisplayRect ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ подсказки Π² клиСнтской систСмС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ nItemIndex ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ индСкс ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠΉ строки Π² спискС. Π― ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π°Π»Π° для отрисовки ΠΈ устанавливала ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ подсказки Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½Π° измСнилась. Для измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² подсказки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция CWnd::SetWindowPos. Π’ качСствС Π΅Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ wndTopMost, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΊΠ½ΠΎ подсказки Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ²Π΅Ρ€Ρ… всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠΎΠ½. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ фокуса Π²Π²ΠΎΠ΄Π° этим ΠΎΠΊΠ½ΠΎΠΌ (ΠΎΠΊΠ½Ρƒ подсказки Π² любом случаС Π½Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„Π»Π°Π³ SWP_NOACTIVATE. Ѐункция CTitleTip::Hide прячСт TitleTip Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CWnd::ShowWindow с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ SW_HIDE.

CTitleTip::OnPaint ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ рисуСт подсказку Π² зависимости ΠΎΡ‚ Π²ΠΈΠ΄Π° элСмСнта управлСния "список". Если Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт "список" Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ отрисовку, функция создаСт ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ структуру DrawItemStruct ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ это ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ Windows ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ сообщСния WM_DRAWITEM. Π Π°Π·Π½ΠΈΡ†Π° лишь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ hDC этой структуры Ρ€Π°Π²Π½Ρ‹ΠΌ хэндлу контСкста устройства элСмСнта "список", CTitleTip::OnPaint ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ это ΠΏΠΎΠ»Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ хэндла контСкста устройства ΠΎΠΊΠ½Π° подсказки. ПослС этого вызываСтся функция m_pListBox->DrawItem, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСдаСтся адрСс Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ структуры DrawItemStruct. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ всСх этих дСйствий являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ элСмСнт "список" рисуСт ΠΎΠ΄Π½Ρƒ ΠΈΠ· своих строк Π² ΠΎΠΊΠ½Π΅ подсказки. ΠžΡ‡Π΅Π½ΡŒ ΡƒΠΌΠ½ΠΎ! Π’ΠΎΡ‚ Π² Ρ‡Π΅ΠΌ прСимущСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½Ρ‹Ρ… интСрфСйсов. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ управлСния "список" Π½Π΅ Π·Π½Π°Π΅Ρ‚ – ΠΈΠ»ΠΈ Π½Π΅ Ρ…ΠΎΡ‡Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ – Π³Π΄Π΅ ΠΎΠ½ рисуСт строку, ΠΎΠ½ Π·Π½Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, ΠΊΠ°ΠΊ Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ. CTitleTip Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ строку списка с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовкой, Π½ΠΎ ΠΎΠ½ Π·Π½Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DrawItemStruct ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ CListBox::DrawItem. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ список являСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ элСмСнтом "список", класс CTitleTip рисуСт всС сам. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, это Π½Π΅ Ρ‚Π°ΠΊ слоТно. Ѐункция отрисовки ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ тСкст ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚ ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ элСмСнта "список", устанавливаСт контСкст устройства, заполняСт Ρ„ΠΎΠ½ ΠΈ рисуСт тСкст.