/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

/* mingw-w64 headers */
#include "libtest.h"

#define TITLE "WinMain"
#define WIDTH 250
#define HEIGHT 250

void Draw(HDC hdc);

LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  PAINTSTRUCT ps;
  switch (Msg)
  {
  case WM_PAINT:
    BeginPaint(hWnd,&ps);
    Draw(ps.hdc);
    EndPaint(hWnd,&ps);
    break;
  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  default:
    return DefWindowProc(hWnd,Msg,wParam,lParam);
  }
  return 0;
}

char szClassName[] = "WinMain";

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  HWND hwnd;
  MSG messages;
  WNDCLASSEX wincl;

  mingw_test_init ();

  wincl.hInstance = hThisInstance;
  wincl.lpszClassName = szClassName;
  wincl.lpfnWndProc = WindowProc;
  wincl.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
  wincl.cbSize = sizeof(WNDCLASSEX);

  wincl.hIcon = LoadIcon(NULL,IDI_APPLICATION);
  wincl.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
  wincl.hCursor = LoadCursor(NULL,IDC_ARROW);
  wincl.lpszMenuName = NULL;
  wincl.cbClsExtra = 0;
  wincl.cbWndExtra = 0;
  wincl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);;

  if (!RegisterClassEx(&wincl)) return 0;

  hwnd = CreateWindowEx(
    0, szClassName, TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
    WIDTH, HEIGHT, HWND_DESKTOP, NULL, hThisInstance, NULL
  );

  ShowWindow(hwnd,nCmdShow);

  while (GetMessage(&messages,NULL,0,0))
  {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
  }
  return (int)messages.wParam;
}

void Draw(HDC hdc)
{
  HBRUSH pinsel;
  pinsel = CreateSolidBrush(RGB(255,255,0));
  Rectangle(hdc,10,10,110,110);
  TextOut(hdc,15,45,"Hello, World!",13);

  SelectObject(hdc,pinsel);
  Ellipse(hdc,100,100,200,200);
  Arc(hdc,120,120,180,180,100,200,200,200);
  SetPixel(hdc,130,140,0);
  SetPixel(hdc,170,140,0);
  MoveToEx(hdc,150,100,0);
  LineTo(hdc,145,90);
  LineTo(hdc,155,80);
  LineTo(hdc,150,75);
}
