>}
CODListBox::GetIdealItemRect перекрывает такой же метод в классе CTitleTipListBox. Как вы видите, его реализация похожа на реализацию метода в базовом классе, за исключением того, что новый метод использует для шрифта переменную m_Font. Конечно, я мог бы добиться результата и без переопределения метода базового класса, если бы воспользовался CWnd::SetFont для установки шрифта для списка. Однако я хотел показать, как нужно перекрывать этот метод в других случаях. Например, вам придется переопределить CTitleTipListBox::GetIdealItemRect, если вы захотите показывать в списке картинки.
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) {
> //{{AFX_DATA_INIT(CTTDemoDlg)
> // NOTE: the ClassWizard will add member initialization here
> //}}AFX_DATA_INIT
> // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
> m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
>}
>void CTTDemoDlg::DoDataExchange(CDataExchange* pDX) {
> CDialog::DoDataExchange(pDX);
> //{{AFX_DATA_MAP(CTTDemoDlg)
> // NOTE: the ClassWizard will add DDX and DDV calls here
> //}}AFX_DATA_MAP
>}
>BEGIN_MESSAGE_MAP(CTTDemoDlg, CDialog)
> //{{AFX_MSG_MAP(CTTDemoDlg)
> ON_WM_PAINT()
> ON_WM_QUERYDRAGICON()
> //}}AFX_MSG_MAP
>END_MESSAGE_MAP()
>/////////////////////////////////////////////////////////////////////////////
>// CTTDemoDlg message handlers
>BOOL CTTDemoDlg::OnInitDialog() {
> CDialog::OnInitDialog();
> // Set the icon for this dialog. The framework does this automatically
> // when the application's main window is not a dialog
> SetIcon(m_hIcon, TRUE); // Set big icon
> SetIcon(m_hIcon, FALSE); // Set small icon
> // Сабклассинг обычного элемента "список"