Читаем Применение Windows API полностью

 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;

};

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

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

<p>Классовая оболочка для потоков</p>Использование потоков

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

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

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

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

class ActiveObject {

public:

 ActiveObject();

 virtual ~ActiveObject() {}

 void Kill();

protected:

 virtual void InitThread() = 0;

 virtual void Run() = 0; virtual void FlushThread() = 0;

 static DWORD WINAPI ThreadEntry(void *pArg);

 int _isDying;

 Thread _thread;

};

Конструктор класса ActiveObject инициализирует удерживаемый поток, передавая ему указатель функции, которую предполагается выполнить и указатель "this" на себя. Мы должны отключить предупреждение, сигнализирующее об использовании "this" до полного создания объекта. Мы знаем, что этот объект не будет использоваться раньше положенного, потому что поток создается в неактивном состоянии. Предполагается, сто конструктор производного класса вызывает _thread.Resume() чтобы активизировать поток.

// The constructor of the derived class

// should call

// _thread.Resume ();

// at the end of construction

ActiveObject::ActiveObject() : _isDying (0),

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных