Исчерпывающее руководство по написанию всплывающих подсказок - [13]

Шрифт
Интервал

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

> // Сабклассинг обычного элемента "список"

> HWND hwndRegListBox = ::GetDlgItem(GetSafeHwnd(), IDC_REGLISTBOX);

> ASSERT(hwndRegListBox);

> VERIFY(m_RegListBox.SubclassWindow(hwndRegListBox));

> // Сабклассинг списка с пользовательской отрисовкой

> HWND hwndODListBox = ::GetDlgItem(GetSafeHwnd(), IDC_ODLISTBOX);

> ASSERT(hwndODListBox);

> VERIFY(m_ODListBox.SubclassWindow(hwndODListBox));

> // Заполнение обоих списков строками

> static char* pszItemArray[] = {

>  "The C++ Programming Language",

>  "C++ Primer",

>  "OLE Controls Inside Out",

>  "Inside OLE 2nd Edition",

>  "Inside ODBC",

>  "Code Complete",

>  "Rapid Software Development",

>  "The Design Of Everyday Things",

>  "Object-Oriented Analysis And Design",

>  "MFC Internals",

>  "Animation Techniques In Win32",

>  "Inside Visual C++",

>  "Writing Solid Code",

>  "Learn Java Now"

> };

> static int nItemArrayCount = sizeof(pszItemArray) / sizeof(pszItemArray[0]);

> for (int n = 0; n < nItemArrayCount; n++) {

>  VERIFY(m_RegListBox.AddString(pszItemArray[n]) != LB_ERR);

>  VERIFY(m_ODListBox.AddString(pszItemArray[n]) != LB_ERR);

> }

> return TRUE; // return TRUE unless you set the focus to a control

>}


>// If you add a minimize button to your dialog, you will need the code below

>// to draw the icon. For MFC applications using the document/view model,

>// this is automatically done for you by the framework.

>void CTTDemoDlg::OnPaint() {

> if (IsIconic()) {

>  CPaintDC dc(this); // device context for painting

>  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

>  // Center icon in client rectangle

>  int cxIcon = GetSystemMetrics(SM_CXICON);

>  int cyIcon = GetSystemMetrics(SM_CYICON);

>  CRect rect;

>  GetClientRect(&rect);


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.