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



CTitleTipListBox::OnLButtonUp захватывает курсор мыши, если окно подсказки показано на экране и CTitleTipListBox еще не захватил мышь. CTitleTipListBox::PreTranslateMessage следит за другими сообщениями от мыши и делает окно представления активным, если список находится в этом окне. Я реализовал это для имитации поведения MFC-окна представления, когда оно получает сообщение WM_MOUSEACTIVATE. Иначе окно может пропустить сообщение об активации мышью, когда пользователь щелкает на окне подсказки.

CODListBox представляет собой пример реализации подсказок TitleTips для элемента "список" с пользовательской отрисовкой (см. рис.13). Константа CODListBox::m_nEdgeSpace используется для добавления пространства по краям текста. Константа CODListBox::m_nFontHeight представляет желаемую высоту шрифта для отображения строк. В переменной CODListBox::m_Font хранится шрифт для отображения строк. CODListBox::CODListBox создает шрифт (m_Font) и использует его при отрисовке элемента "список".

Рис.13. CODListBox

>// ODListBox.h : header file

>//


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

>// CODListBox window

>#include "TitleTipListBox.h"


>class CODListBox : public CTitleTipListBox { // Construction public:

> CODListBox();

>// Overrides

> // ClassWizard generated virtual function overrides

> //{{AFX_VIRTUAL(CODListBox)

>public:

> virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

> virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

> //}}AFX_VIRTUAL

> // Implementation

>public:

> virtual ~CODListBox();

>protected:

> const int m_nEdgeSpace; // Дополнительное пространство вокруг текста

> const int m_nFontHeight; // Высота шрифта

> CFont m_Font; // Шрифт для отображения строк

> virtual int GetIdealItemRect(int nIndex, LPRECT lpRect);

> // Generated message map functions protected:

> //{{AFX_MSG(CODListBox)

> // NOTE – the ClassWizard will add and remove member functions here.

> //}}AFX_MSG

> DECLARE_MESSAGE_MAP()

>};


>///////////////////////////////////////////////////////////////////////////// // ODListBox.cpp : implementation file //

>#include "stdafx.h"

>#include "TTDemo.h"

>#include "ODListBox.h"


>#ifdef _DEBUG

>#define new DEBUG_NEW

>#undef THIS_FILE

>static char THIS_FILE[] = __FILE__;

>#endif


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

>// CODListBox

>CODListBox::CODListBox() : m_nEdgeSpace(4), m_nFontHeight(20) {

> VERIFY(m_Font.CreateFont(m_nFontHeight, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial"));