Чтение онлайн

на главную - закладки

Жанры

Применение Windows API

Легалов А. И.

Шрифт:

Когда объект сопоставляется с Холстом, нельзя забывать освободить его после окончания работы. Это надо делать до тех пор, пока вы не обеспечите такой возможностью вашу программу на языке C++. Используйте только локальные объекты, чьи конструкторы присоединяют, а деструкторы (вызываемые автоматически, при выходе области действия) освобождают объекты (см. страницу «Управление ресурсами» для более детального знакомства с этой методологией). Обратите внимание, что ниже следующие объекты используют HDC (дескрипторы контекстов устройств) в качестве параметры в их конструкторах. Однако, взамен этого, Вы должны просто передать им объект Canvas. Помните, что «Холст» может автоматически приводиться к HDC.

class StockObject {

public:

 StockObject(HDC hdc, int type) : _hdc(hdc) {

_hObjOld = SelectObject(_hdc, GetStockObject(type));

 }

~StockObject {

 SelectObject(_hdc, _hObjOld);

 }

private:

 HGDIOBJ _hObjOld;

 HDC _hdc;

};

Windows имеет набор предопределенных перьев и кистей. Если Вы хотите использовать их, то достаточно присоединить выбранные перья и кисти к вашему холсту не некоторое время.

class WhitePen : public StockObject {

public:

 WhitePen(HDC hdc): StockObject(hdc, WHITE_PEN) {}

};

// example

void Controller::Paint(HWND hwnd) {

 PaintCanvas canvas(hwnd);

 WhitePen pen(canvas);

 canvas.Line(0, 10, 100, 10);

 // destructor of WhitePen

 // destructor of PaintCanvas

}

Если ваша программа поддерживает использование несколько перьев, отсутствующих в Windows, Вы можете предварительно создать их (например, внедрив их в объект View) и использовать объект PenHolder, для временного присоединения к Холсту.

class Pen {

public:

 Pen(COLORREF color) {

_hPen = CreatePen(PS_SOLID, 0, color);

 }

 ~Pen {

DeleteObject(_hpen);

 }

 operator HPEN {

return _hPen;

 }

private:

 HPEN _hPen;

};

class PenHolder {

public:

 PenHolder(HDC hdc, HPEN hPen) : _hdc (hdc) {

_hPenOld = (HPEN)SelectObject (_hdc, hPen);

 }

 ~PenHolder {

SelectObject(_hdc, _hPenOld);

 }

private:

 HDC _hdc;

 HPEN _hPenOld;

};

class View {

public:

 View : _penGreen (RGB (0, 255, 128)) {}

 void Paint(Canvas& canvas) {

PenHolder holder(canvas, _penGreen);

canvas.Line(0, 10, 100, 10);

// destructor of PenHolder

 }

private:

 Pen _penGreen;

};

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

class ColorPen {

public:

 ColorPen(HDC hdc, COLORREF color) : _hdc (hdc) {

_hPen = CreatePen(PS_SOLID, 0, color);

_hPenOld = (HPEN)SelectObject(_hdc, _hPen);

 }

 ~ColorPen {

SelectObject(_hdc, _hPenOld);

DeleteObject(_hPen);

 }

private:

 HDC _hdc;

 HPEN _hPen;

 HPEN _hPenOld;

};

Точно таким же способом Вы можете работать с кистями (кистей, поддерживаемых Windows, гораздо больше, чем перьев). В качестве примера, ниже дается определение ColorBrush.

class ColorBrush {

public:

 ColorBrush(HDC hdc, COLORREF color) : _hdc (hdc) {

_hBrush = CreateSolidBrush(color);

_hBrushOld = (HBRUSH)SelectObject(_hdc, _hBrush);

 }

 ~ColorBrush {

SelectObject(_hdc, _hBrushOld);

DeleteObject(_hBrush);

 }

private:

 HDC _hdc;

 HBRUSH _hBrush;

 HBRUSH _hBrushOld;

Поделиться:
Популярные книги

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI

Телохранитель Генсека. Том 3

Алмазный Петр
3. Медведев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Телохранитель Генсека. Том 3

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Первый среди равных. Книга XII

Бор Жорж
12. Первый среди Равных
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга XII

Третий. Том 5

INDIGO
5. Отпуск
Фантастика:
космическая фантастика
фантастика: прочее
5.00
рейтинг книги
Третий. Том 5

1941, Великая Отечественная катастрофа: Итоги дискуссии

Коллектив авторов
Документальная литература:
военная документалистика
6.25
рейтинг книги
1941, Великая Отечественная катастрофа: Итоги дискуссии

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Катализ

Скаландис Ант
Фантастика:
научная фантастика
5.00
рейтинг книги
Катализ

Князь Целитель 6

Ткачев Андрей Юрьевич
6. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Целитель 6

Руководство по системной поведенченской психотерапии

Курпатов Андрей Владимирович
Научно-образовательная:
психотерапия и консультирование
5.00
рейтинг книги
Руководство по системной поведенченской психотерапии

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Кодекс Крови. Книга ХVIII

Борзых М.
18. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVIII

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР