Вход/Регистрация
Применение Windows API
вернуться

Легалов А. И.

Шрифт:

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;

};

Как всегда, мы пощряем Ваши собственные эксперименты.

Далее: совершенно иная тема — «Потоки» .

Классовая оболочка для потоков

Использование потоков

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

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

Многозадачность — один из наиболее трудных аспектов программирования. Поэтому, для нее тем более важно обеспечить простой набор абстракций и инкапсулировать их в хорошей объектно-ориентированной оболочке. В ОО мире, естественным аналогом потока, являющегося, чисто процедурной абстракцией, служит «Активный объект». Активный объект обладает удерживаемым потоком, который асинхронно выполняет некоторые задачи. Этот поток имеет доступ к всем внутренним (закрытым) данным и методам объекта. Открытый интерфейс Активного объекта доступен внешним агентам (таким как основному потоку, или потоку, несущему сообщения Windows). Поэтому, они могут манипулировать состоянием объекта также, как эта манипуляция осуществляется из удерживаемого потока. Хотя, режим управления при этом сильно ограничен.

Активный Объект сформирован как каркас по имени ActiveObject. Построение производного класса, как предполагается, обеспечивает реализацию для чистых виртуальных методов InitThread, Run и Flush (также как и написание деструктора).

class ActiveObject {

public:

 ActiveObject;

 virtual ~ActiveObject {}

 void Kill;

protected:

 virtual void InitThread = 0;

  • Читать дальше
  • 1
  • ...
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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