home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windows Game Programming for Dummies (2nd Edition)
/
WinGamProgFD.iso
/
mac
/
Source
/
GPCHAP04
/
PROG4_2.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
2002-04-24
|
6KB
|
212 lines
// PROG4_2.CPP - A demo of keyboard and mouse input, be sure
// to take a close look at the event handler
// hit escape to exit, or enter to put up a message box
// move the mouse around and press the buttons
// INCLUDES ///////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <math.h>
// DEFINES ////////////////////////////////////////////////
// defines for windows
#define WINDOW_CLASS_NAME "WINCLASS1"
// MACROS /////////////////////////////////////////////////
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
// GLOBALS ////////////////////////////////////////////////
HWND main_window_handle = NULL; // save the window handle
// 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:
{
// simply validate the window
hdc = BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return(0);
} break;
case WM_KEYDOWN: // this message contains the virtual code
{
// test for the escape key (exit)
if (wparam == VK_ESCAPE)
{
// the user is trying to kill the app, we could post
// a quit message or send a WM_DESTROY message
// let's do the later
PostMessage(hwnd, WM_DESTROY,0,0);
} // end if
return(0);
} break;
case WM_CHAR: // this message contains the ascii code
{
// a key has been pressed
char buffer[80];
sprintf(buffer,"WM_CHAR: wparam=%c, lparam=%d ",wparam,lparam);
// print out the key on the screen
hdc = GetDC(hwnd);
// set the colors
SetTextColor(hdc, RGB(0,255,0));
SetBkColor(hdc,RGB(0,0,0));
SetBkMode(hdc,OPAQUE);
// output the message
TextOut(hdc,0,0,buffer,strlen(buffer));
// release dc
ReleaseDC(hwnd,hdc);
return(0);
} break;
case WM_MOUSEMOVE: // whenever the mouse moves this is sent
{
// extract x,y and buttons
int mouse_x = (int)LOWORD(lparam);
int mouse_y = (int)HIWORD(lparam);
int buttons = (int)wparam;
char buffer[80];
sprintf(buffer,"WM_MOUSEMOVE: x=%d y=%d buttons=%d ",
mouse_x,mouse_y,buttons);
// print out the key on the screen
hdc = GetDC(hwnd);
// set the colors
SetTextColor(hdc, RGB(255,0,0));
SetBkColor(hdc,RGB(0,0,0));
SetBkMode(hdc,OPAQUE);
// output the message
TextOut(hdc,0,16,buffer,strlen(buffer));
// release dc
ReleaseDC(hwnd,hdc);
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
// 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
"Hello Dave", // title
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0,0, // x,y
320,200, // width, height
NULL, // handle to parent
NULL, // handle to menu
hinstance,// instance
NULL))) // creation parms
return(0);
// save the window handle in a global
main_window_handle = hwnd;
// 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
// here's a demo of the KEY_DOWN macro
if (KEY_DOWN(VK_RETURN))
MessageBox(NULL, "You Pressed <ENTER> Didn't You?",
"Asynchronous Keyboard Test",MB_OK);
} // end while
// return to Windows like this
return(msg.wParam);
} // end WinMain
///////////////////////////////////////////////////////////