JOYTOY.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:9k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /* joytoy.c - WinMain() and WndProc() for JOYTOY, along with
  2.  *      initialization and support code.
  3.  *
  4.  * JOYTOY is a Windows with Multimedia application that illustrates
  5.  *  how to use the joystick services. When run, it presents the user
  6.  *  with a crosshair cursor. When the joystick or the mouse is moved,
  7.  *  the cursor follows. When a joystick button is pressed, JOYTOY
  8.  *  produces a sound and draws a bullet hole icon onto the screen.
  9.  *
  10.  *
  11.  *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  12.  *  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
  13.  *  TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR
  14.  *  A PARTICULAR PURPOSE.
  15.  *
  16.  *  Copyright (C) 1993 - 1997 Microsoft Corporation. All Rights Reserved.
  17.  */
  18. #include <windows.h>
  19. #include <mmsystem.h>
  20. #include "joytoy.h"
  21. char szAppName[] = "JoyToy";     
  22. HANDLE hSound1, hSound2;
  23. HANDLE hHole;
  24. LPSTR lpSound1, lpSound2;
  25. /* WinMain - Entry point for JOYTOY.
  26.  */
  27. int PASCAL WinMain(hInstance,hPrevInstance,lpszCmdLine,cmdShow)
  28. HANDLE hInstance,hPrevInstance;
  29. LPSTR lpszCmdLine;
  30. int cmdShow;
  31. {
  32.     MSG msg;
  33.     /* Initialize the application.
  34.      */
  35.     if(! InitJoyToy(hInstance,hPrevInstance))
  36.         return FALSE;
  37.     /* Standard Windows message processing loop.  We don't drop out of
  38.      * this loop until the user quits the application.
  39.      */
  40.     while(GetMessage(&msg, NULL, 0, 0))
  41.     {
  42.         TranslateMessage(&msg);
  43.         DispatchMessage(&msg);
  44.     }
  45.     /* Unlock and free resources allocated by InitJoyToy().
  46.      */
  47.     UnlockResource(hSound1);
  48.     UnlockResource(hSound2);
  49.     FreeResource(hSound1);
  50.     FreeResource(hSound2);
  51.     FreeResource(hHole);
  52.     return (msg.wParam);
  53. }
  54. /* DrawSight - Takes the new joystick position and moves the 
  55.  *  mouse cursor accordingly.
  56.  *
  57.  * Params:  lParam - Specifies the new joystick position. The
  58.  *  high-order word is the y position and the low-order word is
  59.  *  the x position.
  60.  *
  61.  * Returns: void
  62.  */
  63. void DrawSight(DWORD lParam)
  64. {
  65.     WORD x, y;
  66.     POINT pt;
  67.     /* Get the current cursor position in screen coordinates.
  68.      */
  69.     GetCursorPos(&pt);
  70.     /* Joystick positions are expressed in a coordinate system with the
  71.      * origin in the upper left corner and with coordinate ranges from
  72.      * 0 to 65535. Take the 5 most significant bits, so the position is 
  73.      * expressed in the range of 0 to 31.
  74.      */
  75.     x = LOWORD(lParam) >> 11;
  76.     y = HIWORD(lParam) >> 11;
  77.     /* If the joystick is to the left of the center position, then move
  78.      * the cursor position to the left. Otherwise, if the joystick is to 
  79.      * the right of the center position, then move the cursor position 
  80.      * to the right.
  81.      */
  82.     if(x <= 12)
  83.         pt.x = pt.x + x - 17;
  84.     else if(x >= 20)
  85.         pt.x = pt.x + x - 15;
  86.     /* If the joystick is below the center position, then move the cursor 
  87.      * position down. Otherwise, if the joystick is above the center 
  88.      * position, then move the cursor position up.
  89.      */
  90.     if(y <= 12)
  91.         pt.y = pt.y + y - 17;
  92.     else if(y >= 20)
  93.         pt.y = pt.y + y - 15;
  94.     /* Set the new cursor position.
  95.      */
  96.     SetCursorPos(pt.x, pt.y);
  97. }
  98. /* DrawHole - Draws an icon representing a hole in the given window at the 
  99.  * current cursor position.
  100.  *
  101.  * Params:  hWnd - Specifies the handle to the window to draw in.
  102.  *
  103.  * Returns: void
  104.  */
  105. void DrawHole(HWND hWnd)
  106. {
  107.     HDC hDC;
  108.     POINT pt;
  109.     /* Get the current cursor position.
  110.      */
  111.     GetCursorPos(&pt);
  112.     
  113.     /* Get a DC, draw the icon, release DC.
  114.      */
  115.     hDC = GetDC(hWnd);
  116.     DrawIcon(hDC, pt.x - 16, pt.y - 16, hHole);
  117.     ReleaseDC(hWnd, hDC);
  118. }
  119. /* WndProc - Main window procedure function.
  120.  */
  121. LRESULT FAR PASCAL WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  122. {
  123.     switch(message)
  124.     {
  125.         case WM_CREATE:
  126.             /* Capture the joystick. If this fails, beep and display
  127.              * error, then quit.
  128.              */
  129.             if(joySetCapture(hWnd, JOYSTICKID1, 0, FALSE))
  130.             {
  131.                 MessageBeep(MB_ICONEXCLAMATION);
  132.                 MessageBox(hWnd, "Couldn't capture the joystick", NULL, 
  133.                            MB_OK | MB_ICONEXCLAMATION);
  134.                 return -1;
  135.             }            
  136.             break;
  137.         case WM_ACTIVATE:
  138.         case WM_ACTIVATEAPP:
  139.             /* If app becomes inactive (wParam == 0), then we want to quit.
  140.              */
  141.             if(wParam)
  142.                 break;
  143.         case WM_LBUTTONDOWN:
  144.         case WM_MBUTTONDOWN:
  145.         case WM_RBUTTONDOWN:
  146.         case WM_KEYDOWN:
  147.         case WM_CHAR:
  148.             /* Also, any keystrokes or mouse buttons cause us to quit.
  149.              */
  150.             PostMessage(hWnd,WM_CLOSE,0,0L);
  151.             break;
  152.         case WM_ERASEBKGND:
  153.             /* Process this message to keep Windows from erasing background.
  154.              */
  155.             return 0l;
  156.  
  157.         case MM_JOY1BUTTONDOWN :
  158.             /* Joystick button pressed. Detect which button, play appropriate
  159.              * sound, then draw bullet hole. To play sound, pass 
  160.              * sndPlaySound() a pointer to an in-memory WAVE file and 
  161.              * specify the SND_MEMORY flag. Specify SND_LOOP and SND_ASYNC
  162.              * so that sound keeps playing until it's turned off after 
  163.              * joystick button is released.
  164.              */
  165.             if (wParam & JOY_BUTTON1CHG)
  166.             {
  167.                 sndPlaySound(lpSound1, SND_LOOP | SND_ASYNC | SND_MEMORY);
  168.                 DrawHole(hWnd);
  169.             }
  170.             else if (wParam & JOY_BUTTON2CHG)
  171.             {
  172.                 sndPlaySound(lpSound2, SND_LOOP | SND_ASYNC | SND_MEMORY);
  173.                 DrawHole(hWnd);
  174.             }
  175.             break;
  176.         case MM_JOY1BUTTONUP :
  177.             /* Stop playing looped sound.
  178.              */
  179.             if (wParam & JOY_BUTTON1)
  180.                 sndPlaySound(lpSound1, SND_LOOP | SND_ASYNC | SND_MEMORY);
  181.             else if (wParam & JOY_BUTTON2)
  182.                 sndPlaySound(lpSound2, SND_LOOP | SND_ASYNC | SND_MEMORY);
  183.             else
  184.                 sndPlaySound(NULL, 0);
  185.             break;
  186.         case MM_JOY1MOVE :
  187.             /* If joystick buttons are pressed, draw bullet holes
  188.              * while joystick is moved.
  189.              */
  190.             if(wParam & (JOY_BUTTON1 | JOY_BUTTON2))
  191.                 DrawHole(hWnd);
  192.             /* Redraw the crosshair in its new position.
  193.              */
  194.             DrawSight(lParam);
  195.             break;
  196.         case WM_DESTROY:
  197.             /* We're shutting down. Release capture on the joystick, 
  198.              * make sure any sounds that are playing are stopped.
  199.              */
  200.             joyReleaseCapture(JOYSTICKID1);
  201.             sndPlaySound(NULL, 0);
  202.             PostQuitMessage(0);
  203.             break;
  204.     }
  205.     return DefWindowProc(hWnd, message, wParam, lParam);
  206. }
  207. /* InitJoyToy - Application initialization routine.
  208.  *
  209.  * Params:  hInstance - App's instance handle.
  210.  *
  211.  * Returns: TRUE if initialization is successful, FALSE otherwise.
  212.  */
  213. BOOL InitJoyToy(HANDLE hInstance, HANDLE hPrevInstance)
  214. {
  215.     WNDCLASS wc;
  216.     HWND     hWnd;
  217.     /* Make sure there is a joystick device installed.
  218.      */
  219.     if (!joyGetNumDevs())
  220.     {
  221.         MessageBox(NULL, "There are no joystick devices installed. Exiting.",
  222.                    NULL, MB_OK | MB_ICONEXCLAMATION);
  223.         return FALSE;
  224.     }
  225.    
  226.     /* Load bullet hole icon.
  227.      */
  228.     hHole = LoadIcon(hInstance, "HoleIcon");
  229.     if (hPrevInstance == NULL) {
  230.         /* Setup and register a window class for our main window.
  231.          */
  232.         wc.hCursor          = LoadCursor(NULL, IDC_CROSS);
  233.         wc.hIcon            = NULL;
  234.         wc.lpszMenuName     = NULL;
  235.         wc.lpszClassName    = szAppName;
  236.         wc.hbrBackground    = GetStockObject(BLACK_BRUSH);
  237.         wc.hInstance        = hInstance;
  238.         wc.style            = CS_HREDRAW | CS_VREDRAW;
  239.         wc.lpfnWndProc      = WndProc;
  240.         wc.cbClsExtra       = 0;
  241.         wc.cbWndExtra       = 0;
  242.     
  243.         if(! RegisterClass(&wc))
  244.             return FALSE;   
  245.     }
  246.     /* Create a full-screen window with no title bar or scroll bars.
  247.      */
  248.     hWnd = CreateWindow(szAppName, szAppName, WS_POPUP | WS_VISIBLE, 0, 0,
  249.         GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
  250.         NULL, NULL, hInstance, NULL);
  251.     if (hWnd != NULL) {
  252.         /* Load and lock sound resources.
  253.          */
  254.         hSound1 = LoadResource(hInstance, FindResource(hInstance, "SOUND1", "WAVE"));
  255.         hSound2 = LoadResource(hInstance, FindResource(hInstance, "SOUND2", "WAVE"));
  256.         lpSound1 = LockResource(hSound1);
  257.         lpSound2 = LockResource(hSound2);
  258.     }
  259.     return hWnd != NULL;
  260. }