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

ЖАНРЫ

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

Легалов А. И.

Шрифт:

class Canvas {

public:

 // operator cast to HDC

 // (used when passing Canvas to Windows API)

 operator HDC { return _hdc; }

 void Point(int x, int y, COLORREF color) {

::SetPixel(_hdc, x, y, color);

 }

 void MoveTo(int x, int y) {

::MoveToEx(_hdc, x, y, 0);

 }

 void Line(int x1, int y1, int x2, int y2 ) {

MoveToEx(_hdc, x1, y1, 0);

LineTo(_hdc, x2, y2);

 }

 void Rectangle(int left, int top, int right, int bottom) {

// draw rectangle using current pen

// and fill it using current brush

::Rectangle(_hdc, left, top, right, bottom);

 }

 void GetTextSize(int& cxChar, int& cyChar) {

TEXTMETRIC tm;

GetTextMetrics(_hdc, &tm);

cxChar = tm.tmAveCharWidth;

cyChar = tm.tmHeight + tm.tmExternalLeading;

 }

 void Text(int x, int y, char const * buf, int cBuf) {

::TextOut(_hdc, x, y, buf, cbuf);

 }

 void Char(int x, int y, char c) {

TextOut(_hdc, x, y, &c, 1);

 }

 void SelectObject(void* pObj) {

::SelectObject(_hdc, pobj);

 }

protected:

 Canvas(HDC hdc): _hdc(hdc) {}

 HDC _hdc;

};

В

ответ на сообщение WM_PAINT нужно создать объект PaintCanvas. Обратите внимание на способ получения и освобождения DC объектом PaintCanvas.

class PaintCanvas: public Canvas {

public:

 // Constructor obtains the DC

 PaintCanvas(HWND hwnd) : Canvas(BeginPaint(hwnd, &_paint)), _hwnd(hwnd) {}

 // Destructor releases the DC

 ~PaintCanvas {

EndPaint(_hwnd, &_paint);

 }

protected:

 PAINTSTRUCT _paint;

 HWND _hwnd;

};

Другой важный пример — класс UpdateCanvas, который используется для графических операций вне контекста обработки сообщения WM_PAINT. Конечно, ваша программа может всегда инициировать перерисовку, вызывая InvalidateRect, но во многих случаях это было бы массовым убийством. Если ваша программа осуществляет перерисовку новых объектов, когда они обрабатываются или в ответ на действия пользователя, Вы можете модифицировать окно,

используя UpdateCanvas.

class UpdateCanvas: public Canvas {

public:

 UpdateCanvas(HWND hwnd) : Canvas(GetDC(hwnd)), _hwnd(hwnd) {}

 ~UpdateCanvas {

ReleaseDC(_hwnd, _hdc);

 }

protected:

 HWND _hwnd;

};

Можно создать и другие типы Холста: DrawItemCanvas используется для рисования элементов управления их владельцем, MemCanvas — для рисования во фрагментах памяти, и т.д.

Далее: Использование перьев и кистей для рисования на холсте .

Перья и кисти внутри классов

Рисование перьями и раскрашивание кистями

Перевод А. И. Легалова

Англоязычный оригинал находится на сервере компании Reliable Software

Подобно живописцу, Вы нуждаетесь в перьях и кистях, чтобы создать шедевр на вашем холсте. Когда Вы вызываете метод Canvas::Line или Canvas::Rectangle, Windows использует текущие установки пера, чтобы рисовать линии, и текущие установки кисти, чтобы заполнять охватываемые контуры.

Когда объект сопоставляется с Холстом, нельзя забывать освободить его после окончания работы. Это надо делать до тех пор, пока вы не обеспечите такой возможностью вашу программу на языке 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) {

Поделиться с друзьями: