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))
else if (KEY_DOWN(VK_LEFT))
// y-axis
if (KEY_DOWN(VK_UP))
else if (KEY_DOWN(VK_DOWN))
// is user trying to change color
if (KEY_DOWN('C'))
// make sure cursor stays within window
x-axis
if (x>WINDOW_WIDTH)
else if (x<0)
// make sure cursor stays within window
y-axis
if (y>WINDOW_HEIGHT)
else if (y<0)
// 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