Исчерпывающее руководство по написанию всплывающих подсказок | страница 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"));