Исчерпывающее руководство по написанию всплывающих подсказок | страница 25



CODListBox::DrawItem рисует строку по информации из структуры DrawItemStruct. Этот код аналогичен коду в функции CTitleTip::OnPaint, за исключением того, что вместо цветов по умолчанию используются красный и белый цвета. Помните, что этот метод может вызываться из класса CTitleTip для рисования внутри его окна.

CODListBox::MeasureItem вычисляет высоту строки на основе шрифта и заданного пустого пространства вокруг текста. Этот метод вызывается Windows только один раз, потому что у этого элемента "список" установлен стиль LBS_OWNERDRAWFIXED. В случае со стилем LBS_OWNERDRAWVARIABLE метод будет вызываться для каждой строки.

В диалоге CTTDemoDlg присутствуют оба рассмотренных элемента "список", и большая часть кода была сгенерирована AppWizard'ом (см. рис.14). Я добавил в класс переменные m_RegListBox и m_ODListBox для обычного списка и списка с пользовательской отрисовкой, соответственно. Еще я добавил код в функцию CTTDemoDlg::OnInitDialog, где производится сабклассинг обоих элементов "список" вызовом CWnd::SubclassWindow. Я загружаю оба списка из статического массива pszItemArray.

Рис.14. CTTDemoDlg

>// TTDemoDlg.h : header file /////////////////////////////////////////////////////////////////////////////

>// CTTDemoDlg dialog


>#include "TitleTipListBox.h"

>#include "ODListBox.h"

>class CTTDemoDlg : public CDialog { // Construction public:

> CTTDemoDlg(CWnd* pParent = NULL); // standard constructor

>// Dialog Data

> //{{AFX_DATA(CTTDemoDlg)

> enum { IDD = IDD_TTDEMO_DIALOG };

> // NOTE: the ClassWizard will add data members here

> //}}AFX_DATA

> // ClassWizard generated virtual function overrides

> //{{AFX_VIRTUAL(CTTDemoDlg)

>protected:

> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

> //}}AFX_VIRTUAL

> // Implementation

>protected:

> HICON m_hIcon;

> CTitleTipListBox m_RegListBox; // Обычный список

> CODListBox m_ODListBox; // Список с пользовательской отрисовкой

> // Generated message map functions

> //{{AFX_MSG(CTTDemoDlg)

> virtual BOOL OnInitDialog();

> afx_msg void OnPaint();

> afx_msg HCURSOR OnQueryDragIcon();

> //}}AFX_MSG

> DECLARE_MESSAGE_MAP()

>};


>// TTDemoDlg.cpp : implementation file

>#include "stdafx.h"

>#include "TTDemo.h"

>#include "TTDemoDlg.h"


>#ifdef _DEBUG

>#define new DEBUG_NEW

>#undef THIS_FILE

>static char THIS_FILE[] = __FILE__;

>#endif


>/////////////////////////////////////////////////////////////////////////////

>// CTTDemoDlg dialog

>CTTDemoDlg::CTTDemoDlg(CWnd* pParent /*=NULL*/) : CDialog(CTTDemoDlg::IDD, pParent) {