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