Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок

Здесь есть возможность читать онлайн «Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Исчерпывающее руководство по написанию всплывающих подсказок: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Исчерпывающее руководство по написанию всплывающих подсказок»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Исчерпывающее руководство по написанию всплывающих подсказок — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Исчерпывающее руководство по написанию всплывающих подсказок», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Рис.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"));

}

CODListBox::~CODListBox() { }

int CODListBox::GetIdealItemRect(int nIndex, LPRECT lpRect) {

ASSERT(nIndex >= 0);

int nResult = GetItemRect(nIndex, lpRect);

if (nResult != LB_ERR) {

CClientDC DC(this);

CFont* pOldFont = DC.SelectObject(&m_Font);

// Calculate the text length.

CString strItem;

GetText(nIndex, strItem);

CSize TextSize = DC.GetTextExtent(strItem);

// Взять максимум от обычной ширины и идеальной ширины.

lpRect->right = max(lpRect->right, lpRect->left + TextSize.cx + (m_nEdgeSpace * 2));

DC.SelectObject(pOldFont);

}

return nResult;

}

BEGIN_MESSAGE_MAP(CODListBox, CTitleTipListBox)

//{{AFX_MSG_MAP(CODListBox)

// NOTE – the ClassWizard will add and remove mapping macros here.

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CODListBox message handlers

void CODListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {

CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

ASSERT_VALID(pDC);

int nSavedDC = pDC->SaveDC();

CString strItem;

if (lpDrawItemStruct->itemID != –1) {

GetText(lpDrawItemStruct->itemID, strItem);

}

COLORREF TextColor;

COLORREF BackColor;

UINT nItemState = lpDrawItemStruct->itemState;

if (nItemState & ODS_SELECTED) {

TextColor = RGB(255, 255, 255); // Белый

BackColor = RGB(255, 0, 0); // Красный

} else {

TextColor = RGB(255, 0, 0); // Красный

BackColor = RGB(255, 255, 255); // Белый

}

CRect ItemRect(lpDrawItemStruct->rcItem);

// Нарисовать фон

pDC->FillSolidRect(ItemRect, BackColor);

// Нарисовать текст

pDC->SetTextColor(TextColor);

pDC->SetBkMode(TRANSPARENT);

pDC->SelectObject(&m_Font);

ItemRect.left += m_nEdgeSpace;

pDC->DrawText(strItem, ItemRect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);

ItemRect.left –= m_nEdgeSpace;

// Нарисовать по необходимости рамку фокуса

if (nItemState & ODS_FOCUS) {

pDC->DrawFocusRect(ItemRect);

}

pDC->RestoreDC(nSavedDC);

}

void CODListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) {

lpMeasureItemStruct->itemHeight = m_nFontHeight + (m_nEdgeSpace * 2);

}

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.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Исчерпывающее руководство по написанию всплывающих подсказок»

Представляем Вашему вниманию похожие книги на «Исчерпывающее руководство по написанию всплывающих подсказок» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


libcat.ru: книга без обложки
Роджер Желязны
Отзывы о книге «Исчерпывающее руководство по написанию всплывающих подсказок»

Обсуждение, отзывы о книге «Исчерпывающее руководство по написанию всплывающих подсказок» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x