// ----------------------------------------
// Функции для приложения LINER
// ----------------------------------------
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <mem.h>
#include "liner.hpp"

// Прототипы функций
void DrawLines(HDC);
void DrawPolyline(HDC);
void DrawArc(HDC);
void DrawRectangles(HDC);
void DrawPolygon(HDC);
void DrawEllipse(HDC);
void DrawCircle(HDC);
void DrawPie(HDC);
void DrawChord(HDC);

// Размеры внутренней области окна
extern short cxClient, cyClient;

// -------------------------------------------
// DrawLines
// Рисование линий различной толщины и стиля
// -------------------------------------------
void DrawLines(HDC hdc)
{
  HPEN hpenW10, hpenW50;
  HPEN hpenDot, hpenDash, hpenDashDot, hpenOldPen;

  // Создаем несколько перьев: два пера толщиной
  // 1 мм и 5 мм, пунктирное, штриховое и
  // штрих-пунктирное
  hpenW10      = CreatePen(PS_SOLID, 10,  RGB(0,0,0));
  hpenW50      = CreatePen(PS_SOLID, 50,  RGB(0,0,0));
  hpenDot      = CreatePen(PS_DOT, 0,     RGB(0,0,0));
  hpenDash     = CreatePen(PS_DASH, 0,    RGB(0,0,0));
  hpenDashDot  = CreatePen(PS_DASHDOT, 0, RGB(0,0,0));

  // Рисуем тонкую линию пером, выбранным в контекст
  // отображения по умолчанию, и подписываем эту линию
  MoveToEx(hdc, 100, 100, NULL);
  LineTo(hdc, 600, 100);
  TextOut(hdc, 700, 100, "PS_SOLID, 1 pixel", 17);

  // Выбираем перо толщиной 1 мм
  hpenOldPen = SelectPen(hdc, hpenW10);
  
  // Рисуем линию выбранным пером
  MoveToEx(hdc, 100, 200, NULL);
  LineTo(hdc, 600, 200);
  TextOut(hdc, 700, 200, "PS_SOLID, 1 mm", 14);

  // Перебираем остальные перья

  SelectPen(hdc, hpenW50);

  MoveToEx(hdc, 100, 300, NULL);
  LineTo(hdc, 600, 300);
  TextOut(hdc, 700, 300, "PS_SOLID, 5 mm", 14);

  SelectPen(hdc, hpenDot);

  MoveToEx(hdc, 100, 400, NULL);
  LineTo(hdc, 600, 400);
  TextOut(hdc, 700, 400, "PS_DOT", 6);

  SelectPen(hdc, hpenDash);

  MoveToEx(hdc, 100, 500, NULL);
  LineTo(hdc, 600, 500);
  TextOut(hdc, 700, 500, "PS_DASH", 7);

  SelectPen(hdc, hpenDashDot);

  MoveToEx(hdc, 100, 600, NULL);
  LineTo(hdc, 600, 600);
  TextOut(hdc, 700, 600, "PS_DASHDOT", 10);

  // Выбираем старое перо
  SelectPen(hdc, hpenOldPen);

  // Удаляем созданные нами перья
  DeletePen(hpenW10);
  DeletePen(hpenW50);
  DeletePen(hpenDot);
  DeletePen(hpenDash);
  DeletePen(hpenDashDot);
}

// -------------------------------------------
// DrawPolyline
// Рисование ломаной линии
// -------------------------------------------
void DrawPolyline(HDC hdc)
{
  // Массив координат точек излома
  POINT ptPoints[] =
  {
    {10, 10},   {100, 310},
    {40, 300},  {300, 15},
    {135, 340}, {113, 125},
    {250, 137}, {300, 300}
  };

  // Рисуем ломаную линию
  Polyline(hdc, ptPoints,
    sizeof ptPoints / sizeof ptPoints[0]);
}

// -------------------------------------------
// DrawArc
// Рисование дуги эллипса
// -------------------------------------------
void DrawArc(HDC hdc)
{
  HPEN hpenW10, hpenOldPen;

  // Создаем перо толщиной 1 мм и выбираем его
  hpenW10  = CreatePen(PS_SOLID, 10, RGB(0,0,0));
  hpenOldPen = SelectPen(hdc, hpenW10);

  // Рисуем дугу
  Arc(hdc,
    100, 600, // верхний левый угол прямоугольника
    800, 100, // нижний правый угол прямоугольника
    650, 650, // начало
    750, 0);  // конец

  // Выбираем старое перо
  SelectPen(hdc, hpenOldPen);

  // Удаляем созданное перо 
  DeletePen(hpenW10);
}

// -------------------------------------------
// DrawRectangles
// Рисование прямоугольников
// -------------------------------------------
void DrawRectangles(HDC hdc)
{
  HPEN hpenW10, hpenOldPen;
  HBRUSH hbrush, hbrushOldBrush;
  POINT pt[2];
  RECT rc = {350, 500, 500, 400};

  // Рисуем прямоугольник вокруг внутренней области окна
  // Так как установлен метрический режим отображения,
  // а размеры окна, передаваемые вместе с сообщением
  // WM_SIZE, выражены в пикселах, выполняем
  // преобразование физических координат в логические
  pt[0].x = 0;
  pt[0].y = cyClient;
  pt[1].x = cxClient;
  pt[1].y = 0;
  DPtoLP(hdc, pt, 2);

  // Создаем перо толщиной 1 мм и выбираем его
  hpenW10  = CreatePen(PS_SOLID, 10, RGB(0,0,0));
  hpenOldPen = SelectPen(hdc, hpenW10);

  // Рисуем прямоугольник
  Rectangle(hdc, pt[0].x, pt[0].y,
    pt[1].x, pt[1].y);

  // Выбираем серую кисть
  hbrush = GetStockBrush(GRAY_BRUSH);
  hbrushOldBrush = SelectBrush(hdc, hbrush);

  // Рисуем прямоугольник, закрашенный серым цветом
  Rectangle(hdc, 100, 500, 300, 50);

  // Создаем и выбираем кисть для штриховки
  hbrush = CreateHatchBrush(HS_DIAGCROSS,
     RGB(0,0,0));
  SelectBrush(hdc, hbrush);

  // Рисуем заштрихованный прямоугольник
  Rectangle(hdc, 50, 300, 500, 100);

  // Выбираем старое перо и кисть
  SelectPen(hdc, hpenOldPen);
  SelectBrush(hdc, hbrushOldBrush);
  
  // Заштриховываем прямоугольную область кистью
  // hbrush, которая НЕ ВЫБРАНА в контекст
  FillRect(hdc, &rc, hbrush);

  // Рисуем прямоугольник со скругленными углами
  RoundRect(hdc, 550, 200, 800, 100, 50, 50);

  // Удаляем созданные нами перо и кисть
  DeletePen(hpenW10);
  DeleteBrush(hbrush);
}

// -------------------------------------------
// DrawPolygon
// Рисование многоугольника
// -------------------------------------------
void DrawPolygon(HDC hdc)
{
  HBRUSH hbrush, hbrushOldBrush;
  int nOldPolyFillMode;

  // Координаты вершин первого многоугольника
  POINT ptPoints1[] =
  {
    {10, 10},   {100, 310}, {40, 300},
    {300, 15},  {135, 340}, {113, 125},
    {250, 137}, {300, 300}
  };

  // Координаты вершин второго многоугольника
  POINT ptPoints2[] =
  {
    {310, 10},  {400, 310}, {340, 300},
    {600, 15},  {435, 340}, {413, 125},
    {550, 137}, {600, 300}
  };

  // Выбираем встроенную серую кисть
  hbrush = GetStockBrush(GRAY_BRUSH);
  hbrushOldBrush = SelectBrush(hdc, hbrush);

  // Рисуем первый многоугольник в режиме
  // заполнения ALTERNATE, установленном
  // по умолчанию
  Polygon(hdc, ptPoints1,
    sizeof ptPoints1 / sizeof ptPoints1[0]);

  // Устанавливаем режим заполнения WINDING
  nOldPolyFillMode = SetPolyFillMode(hdc, WINDING);

  // Рисуем второй многоугольник
  Polygon(hdc, ptPoints2,
    sizeof ptPoints2 / sizeof ptPoints2[0]);

  // Восстанавливаем старый режим заполнения
  SetPolyFillMode(hdc, nOldPolyFillMode);
  SelectBrush(hdc, hbrushOldBrush);
}

// -------------------------------------------
// DrawEllipse
// Рисование эллипса
// -------------------------------------------
void DrawEllipse(HDC hdc)
{
  POINT pt[2];

  // Эллипс будет вписан во внутреннюю область
  // окна, поэтому определяем координаты углов
  // в текущей (метрической) системе координат,
  // выполняя преобразование
  pt[0].x = 0;
  pt[0].y = cyClient;
  pt[1].x = cxClient;
  pt[1].y = 0;
  DPtoLP(hdc, pt, 2);

  // Рисуем эллипс
  Ellipse(hdc, pt[0].x, pt[0].y,
    pt[1].x, pt[1].y);
}

// -------------------------------------------
// DrawCircle
// Рисование окружности
// -------------------------------------------
void DrawCircle(HDC hdc)
{
  // Рисуем эллипс, вписанный в квадрат
  Ellipse(hdc, 100, 600,
    600, 100);
}

// -------------------------------------------
// DrawPie
// Рисование сектора круга
// -------------------------------------------
void DrawPie(HDC hdc)
{
  HPEN hpenW10, hpenOldPen;

  // Создаем перо и выбираем его
  hpenW10  = CreatePen(PS_SOLID, 10, RGB(0,0,0));
  hpenOldPen = SelectPen(hdc, hpenW10);

  // Рисуем сектор круга
  Pie(hdc,
    100, 600, 800, 100, 650, 650, 750, 0);

  // Выбираем старое перо и удаляем созданное
  SelectPen(hdc, hpenOldPen);
  DeletePen(hpenW10);
}

// -------------------------------------------
// DrawChord
// Рисование сегмента круга
// -------------------------------------------
void DrawChord(HDC hdc)
{
  HPEN hpenW10, hpenOldPen;

  hpenW10  = CreatePen(PS_SOLID, 10, RGB(0,0,0));
  hpenOldPen = SelectPen(hdc, hpenW10);

  // Рисуем сегмент круга
  Chord(hdc,
    100, 600, 800, 100, 650, 650, 750, 0);

  SelectPen(hdc, hpenOldPen);
  DeletePen(hpenW10);
}
