Малювання пір’ям і розфарбовування кистями, Різне, Програмування, статті

Переклад А.І. Легалова, SoftCraft

Англомовний оригінал знаходиться на сервері компанії 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)
      {
          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;
      };

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*