home *** CD-ROM | disk | FTP | other *** search
/ Windows Game Programming for Dummies (2nd Edition) / WinGamProgFD.iso / mac / Source / GPCHAP04 / PROG4_2.CPP < prev    next >
C/C++ Source or Header  |  2002-04-24  |  6KB  |  212 lines

  1. // PROG4_2.CPP - A demo of keyboard and mouse input, be sure
  2. // to take a close look at the event handler
  3. // hit escape to exit, or enter to put up a message box
  4. // move the mouse around and press the buttons
  5.  
  6. // INCLUDES ///////////////////////////////////////////////
  7. #define WIN32_LEAN_AND_MEAN  
  8.  
  9. #include <windows.h>  
  10. #include <windowsx.h>
  11. #include <stdio.h>
  12. #include <math.h>
  13.  
  14. // DEFINES ////////////////////////////////////////////////
  15.  
  16. // defines for windows 
  17. #define WINDOW_CLASS_NAME "WINCLASS1"
  18.  
  19. // MACROS /////////////////////////////////////////////////
  20.  
  21. #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
  22. #define KEY_UP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
  23.  
  24. // GLOBALS ////////////////////////////////////////////////
  25. HWND main_window_handle = NULL; // save the window handle
  26.  
  27. // FUNCTIONS //////////////////////////////////////////////
  28. LRESULT CALLBACK WindowProc(HWND hwnd, 
  29.                             UINT msg, 
  30.                             WPARAM wparam, 
  31.                             LPARAM lparam)
  32. {
  33. // this is the main message handler of the system
  34. PAINTSTRUCT        ps;        // used in WM_PAINT
  35. HDC                hdc;    // handle to a device context
  36.  
  37. // what is the message
  38. switch(msg)
  39.     {    
  40.     case WM_CREATE: 
  41.         {
  42.         // do initialization stuff here
  43.         return(0);
  44.         } break;
  45.  
  46.     case WM_PAINT: 
  47.         {
  48.         // simply validate the window
  49.         hdc = BeginPaint(hwnd,&ps);     
  50.         EndPaint(hwnd,&ps);
  51.         return(0);
  52.            } break;
  53.  
  54.     case WM_KEYDOWN: // this message contains the virtual code
  55.         {
  56.         // test for the escape key (exit)
  57.         if (wparam == VK_ESCAPE)
  58.            {
  59.            // the user is trying to kill the app, we could post 
  60.            // a quit message or send a WM_DESTROY message
  61.            // let's do the later
  62.            PostMessage(hwnd, WM_DESTROY,0,0);
  63.  
  64.            } // end if
  65.  
  66.         return(0);
  67.         } break;
  68.         
  69.     case WM_CHAR: // this message contains the ascii code
  70.         {
  71.         // a key has been pressed
  72.         char buffer[80];
  73.         sprintf(buffer,"WM_CHAR: wparam=%c, lparam=%d        ",wparam,lparam);
  74.           
  75.         // print out the key on the screen
  76.         hdc = GetDC(hwnd);
  77.         
  78.         // set the colors 
  79.         SetTextColor(hdc, RGB(0,255,0));
  80.         SetBkColor(hdc,RGB(0,0,0));
  81.         SetBkMode(hdc,OPAQUE);
  82.  
  83.         // output the message
  84.         TextOut(hdc,0,0,buffer,strlen(buffer));
  85.  
  86.         // release dc
  87.         ReleaseDC(hwnd,hdc);
  88.  
  89.         return(0);
  90.         } break;
  91.  
  92.     case WM_MOUSEMOVE: // whenever the mouse moves this is sent
  93.          {
  94.         // extract x,y and buttons
  95.         int mouse_x = (int)LOWORD(lparam);
  96.         int mouse_y = (int)HIWORD(lparam);
  97.         int buttons = (int)wparam;
  98.  
  99.         char buffer[80];
  100.         sprintf(buffer,"WM_MOUSEMOVE: x=%d y=%d buttons=%d        ",
  101.                 mouse_x,mouse_y,buttons);
  102.           
  103.         // print out the key on the screen
  104.         hdc = GetDC(hwnd);
  105.         
  106.         // set the colors 
  107.         SetTextColor(hdc, RGB(255,0,0));
  108.         SetBkColor(hdc,RGB(0,0,0));
  109.         SetBkMode(hdc,OPAQUE);
  110.  
  111.         // output the message
  112.         TextOut(hdc,0,16,buffer,strlen(buffer));
  113.  
  114.         // release dc
  115.         ReleaseDC(hwnd,hdc);    
  116.  
  117.         return(0);
  118.         } break;
  119.  
  120.     case WM_DESTROY: 
  121.         {
  122.         // kill the application            
  123.         PostQuitMessage(0);
  124.         return(0);
  125.         } break;
  126.  
  127.     default:break;
  128.  
  129.     } // end switch
  130.  
  131. // process any messages that we didn't take care of 
  132. return (DefWindowProc(hwnd, msg, wparam, lparam));
  133.  
  134. } // end WinProc
  135.  
  136. // WINMAIN ////////////////////////////////////////////////
  137. int WINAPI WinMain(    HINSTANCE hinstance,
  138.                     HINSTANCE hprevinstance,
  139.                     LPSTR lpcmdline,
  140.                     int ncmdshow)
  141. {
  142.  
  143. WNDCLASS winclass;    // this will hold the class we create
  144. HWND     hwnd;        // generic window handle
  145. MSG         msg;        // generic message
  146.  
  147. // first fill in the window class stucture
  148. winclass.style            = CS_DBLCLKS | CS_OWNDC | 
  149.                           CS_HREDRAW | CS_VREDRAW;
  150. winclass.lpfnWndProc    = WindowProc;
  151. winclass.cbClsExtra        = 0;
  152. winclass.cbWndExtra        = 0;
  153. winclass.hInstance        = hinstance;
  154. winclass.hIcon            = LoadIcon(NULL, IDI_APPLICATION);
  155. winclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
  156. winclass.hbrBackground    = (HBRUSH)GetStockObject(BLACK_BRUSH);
  157. winclass.lpszMenuName    = NULL;
  158. winclass.lpszClassName    = WINDOW_CLASS_NAME;
  159.  
  160. // register the window class
  161. if (!RegisterClass(&winclass))
  162.     return(0);
  163.  
  164. // create the window
  165. if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME, // class
  166.                           "Hello Dave",         // title
  167.                           WS_OVERLAPPEDWINDOW | WS_VISIBLE,
  168.                            0,0,       // x,y
  169.                           320,200, // width, height
  170.                           NULL,       // handle to parent 
  171.                           NULL,       // handle to menu
  172.                           hinstance,// instance
  173.                           NULL)))    // creation parms
  174. return(0);
  175.  
  176. // save the window handle in a global
  177. main_window_handle = hwnd;
  178.  
  179. // enter main event loop
  180. while(1)
  181.     {
  182.     if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  183.         { 
  184.         // test if this is a quit
  185.         if (msg.message == WM_QUIT)
  186.            break;
  187.     
  188.         // translate any accelerator keys
  189.         TranslateMessage(&msg);
  190.  
  191.         // send the message to the window proc
  192.         DispatchMessage(&msg);
  193.         } // end if
  194.     
  195.     // main game processing goes here
  196.  
  197.     // here's a demo of the KEY_DOWN macro
  198.     if (KEY_DOWN(VK_RETURN))    
  199.        MessageBox(NULL, "You Pressed <ENTER> Didn't You?",
  200.                  "Asynchronous Keyboard Test",MB_OK);
  201.  
  202.  
  203.     } // end while
  204.  
  205. // return to Windows like this
  206. return(msg.wParam);
  207.  
  208. } // end WinMain
  209.  
  210. ///////////////////////////////////////////////////////////
  211.  
  212.