A Simple Draw PGM

// etchASketch.CPP - Drawing program based on the game console

// uses arrow keys, c changes colors

// INCLUDES

#define WIN32_LEAN_AND_MEAN 

#include <windows.h>   // include important windows stuff

#include <windowsx.h>

#include <mmsystem.h>

#include <iostream.h> // include important C/C++ stuff

#include <conio.h>

#include <stdlib.h>

#include <malloc.h>

#include <memory.h>

#include <string.h>

#include <stdarg.h>

#include <stdio.h>

#include <math.h>

#include <io.h>

#include <fcntl.h>

// DEFINES

// defines for windows

#define WINDOW_CLASS_NAME "WINXCLASS"  // class name

#define WINDOW_WIDTH  320              // size of window

#define WINDOW_HEIGHT 200

// MACROS

// these read the keyboard asynchronously

#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

#define KEY_UP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// PROTOTYPES

int Game_Init(void *parms=NULL);

int Game_Shutdown(void *parms=NULL);

int Game_Main(void *parms=NULL);

// GLOBALS

HWND main_window_handle = NULL; // save the window handle

HINSTANCE main_instance = NULL; // save the instance

HDC       main_gdc;             // save the graphics context

char buffer[80];                // used to print text

// FUNCTIONS

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam,

                            LPARAM lparam)

{ // this is the main message handler of the system

  PAINTSTRUCT     ps;            // used in WM_PAINT

  HDC             hdc;     // handle to a device context

  // what is the message

  switch(msg)

  {  

      case WM_CREATE:

      { // do initialization stuff here

        return(0);

      } break;

 

      case WM_PAINT:

      { // start painting

        hdc = BeginPaint(hwnd,&ps);

        // end painting

        EndPaint(hwnd,&ps);

        return(0);

      } break;

 

      case WM_DESTROY:

      { // kill the application                

        PostQuitMessage(0);

        return(0);

      } break;

      default:break;

  } // end switch

  // process any messages that we didn't take care of

  return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

// **************  WINMAIN   ******************

int WINAPI WinMain(     HINSTANCE hinstance, HINSTANCE hprevinstance,

                              LPSTR lpcmdline, int ncmdshow)

{ WNDCLASS winclass;    // this will hold the class we create

  HWND      hwnd;            // generic window handle

  MSG       msg;       // generic message

  HDC      hdc;       // generic dc

  PAINTSTRUCT ps;     // generic paintstruct

  // first fill in the window class stucture

  winclass.style              = CS_DBLCLKS | CS_OWNDC |

                          CS_HREDRAW | CS_VREDRAW;

  winclass.lpfnWndProc  = WindowProc;

  winclass.cbClsExtra         = 0;

  winclass.cbWndExtra         = 0;

  winclass.hInstance          = hinstance;

  winclass.hIcon              = LoadIcon(NULL, IDI_APPLICATION);

  winclass.hCursor            = LoadCursor(NULL, IDC_ARROW);

  winclass.hbrBackground      = (HBRUSH) GetStockObject(BLACK_BRUSH);

  winclass.lpszMenuName     = NULL;

  winclass.lpszClassName      = WINDOW_CLASS_NAME;

  // register the window class

  if (!RegisterClass(&winclass))

     return(0);

  // create the window

  if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME, // class

                    "WinX Game Console - Etch A Sketch", WS_OVERLAPPEDWINDOW | WS_VISIBLE,

                     0,0, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hinstance, NULL)))    

     return(0);

  // save the window handle and instance in a global

  main_window_handle = hwnd;

  main_instance      = hinstance;

  // perform all game console specific initialization

  Game_Init();

  // enter main event loop

  while(1)

  { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))

      {

            // test if this is a quit

        if (msg.message == WM_QUIT)

           break;

     

            // translate any accelerator keys

            TranslateMessage(&msg);

            // send the message to the window proc

            DispatchMessage(&msg);

      } // end if

   

    // main game processing goes here

    Game_Main();

  } // end while

  // shutdown game and release all resources

  Game_Shutdown();

  // return to Windows like this

  return(msg.wParam);

} // end WinMain

// WINX GAME PROGRAMMING CONSOLE FUNCTIONS

int Game_Init(void *parms)

{ // this function is where you do all the initialization

  // for your game

  // retrieve the graphics device context once and save it

  // we can do this since the winclass has OWN_DC

  main_gdc = GetDC(main_window_handle);

  // return success

  return(1);

} // end Game_Init

int Game_Shutdown(void *parms)

{

  // this function is where you shutdown your game and

  // release all resources that you allocated

  // release the graphics device context

  ReleaseDC(main_window_handle, main_gdc);

  // return success

  return(1);

} // end Game_Shutdown

int Game_Main(void *parms)

{

  // this is the workhorse of your game it will be called

  // continuously in real-time this is like main() in C

  // all the calls for you game go here!

  // notice the use of "static" this is so the variables

  // don't change from call to call

  static int x = WINDOW_WIDTH/2,    // initial position

             y = WINDOW_HEIGHT/2;

  static COLORREF color = RGB(255,0,0); // initial color

  //  ***** test for user input

  // trying to escape

  if (KEY_DOWN(VK_ESCAPE))

      PostMessage(main_window_handle,WM_DESTROY,0,0);

  // is user moving cursor

  // x-axis

  if (KEY_DOWN(VK_RIGHT)) x++;

  else if (KEY_DOWN(VK_LEFT))  x--;

  // y-axis

  if (KEY_DOWN(VK_UP)) y--;

  else if (KEY_DOWN(VK_DOWN)) y++;

  // is user trying to change color

  if (KEY_DOWN('C'))color=RGB(rand()%256,rand()%256,rand()%256);

  // make sure cursor stays within window x-axis

  if (x>WINDOW_WIDTH) x=0;

  else if (x<0) x=WINDOW_WIDTH-1;

  // make sure cursor stays within window y-axis

  if (y>WINDOW_HEIGHT)  y=0;

  else if (y<0) y=WINDOW_HEIGHT-1;

  // draw pen tip - 2 pixels wide

  SetPixel(main_gdc, x,y,color);

  SetPixel(main_gdc, x+1,y,color);

  SetPixel(main_gdc, x,y+1,color);

  SetPixel(main_gdc, x+1,y+1,color);

 

  Sleep(20);  // wait a sec

  return(1);  // return success

} // end Game_Main