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

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright (C) 1993-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. #include <windows.h>
  11. #include <stdio.h>
  12. #include "console.h"
  13. /*********************************************************************
  14. * FUNCTION: demoCursor(HANDLE hConOut)                               *
  15. *                                                                    *
  16. * PURPOSE: demonstrate GetConsoleCursorInfo, SetConsoleCursorInfo,   *
  17. *          and SetConsoleCursorPosition. Show the current cursor     *
  18. *          information, then have the cursor follow the mouse around *
  19. *          the screen. Shrink the cursor size when the user clicks   *
  20. *          one button, and grow the cursor when he clicks the other. *
  21. *                                                                    *
  22. * INPUT: the console output handle to write to and manipulate the    *
  23. *        cursor for.                                                 *
  24. *********************************************************************/
  25. void demoCursor(HANDLE hConOut)
  26. {
  27.   BOOL bSuccess;
  28.   /* to set initial size and visibility of cursor */
  29.   CONSOLE_CURSOR_INFO cci;
  30.   INPUT_RECORD inputBuffer;
  31.   DWORD dwInputEvents;
  32.   HANDLE hStdIn;
  33.   CHAR szTemp[128];
  34.   setConTitle(__FILE__);
  35.   myPuts(hConOut, "Current cursor information, as reported byn"
  36.                   "GetConsoleCursorInfo:n");
  37.   bSuccess = GetConsoleCursorInfo(hConOut, &cci);
  38.   PERR(bSuccess, "GetConsoleCursorInfo");
  39.   sprintf(szTemp, "Cursor size (in percent maximum): %d", cci.dwSize);
  40.   myPuts(hConOut, szTemp);
  41.   sprintf(szTemp, "Cursor visible: %s", cci.bVisible ? "TRUE" : "FALSE");
  42.   myPuts(hConOut, szTemp);
  43.   myPuts(hConOut, "nLet's use SetConsoleCursorPosition to have the consolen"
  44.                   "cursor follow the mouse pointer around on the screen.n"
  45.                   "When the left mouse button is clicked, we'll use n"
  46.                   "SetConsoleCursorInfo to increase the cursor size by 10%.n"
  47.                   "When the right mouse button is clicked, the cursor sizen"
  48.                   "will be decreased by 10%. To return, hit ESC.");
  49.   hStdIn = GetStdHandle(STD_INPUT_HANDLE);
  50.   for(;;)
  51.     {
  52.       /* get an input event */
  53.     bSuccess = ReadConsoleInput(hStdIn, &inputBuffer, 1, &dwInputEvents);
  54.     PERR(bSuccess, "ReadConsoleInput");
  55.     switch (inputBuffer.EventType)
  56.       {
  57.       case KEY_EVENT:
  58.         /* is it a key-down event? Is it an ESC char? If so return */
  59.         if (inputBuffer.Event.KeyEvent.bKeyDown &&
  60.             inputBuffer.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
  61.           return;
  62.         break;
  63.       case MOUSE_EVENT:
  64.         /* if the mouse moved draw the cursor at the mouse position */
  65.         if (inputBuffer.Event.MouseEvent.dwEventFlags == MOUSE_MOVED)
  66.           {
  67.           bSuccess = SetConsoleCursorPosition(hConOut,
  68.               inputBuffer.Event.MouseEvent.dwMousePosition);
  69.           PERR(bSuccess, "SetConsoleCursorPosition");
  70.           }
  71.         /* if the mouse is clicked, increase/decrease cursor size. */
  72.         /* Consider a double click a single click for this sample */
  73.         if (!inputBuffer.Event.MouseEvent.dwEventFlags || /* a click */
  74.             inputBuffer.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
  75.           {
  76.           /* is the leftmost mouse button is down? If so, increase cursor */
  77.           if (inputBuffer.Event.MouseEvent.dwButtonState ==
  78.               FROM_LEFT_1ST_BUTTON_PRESSED)
  79.             {
  80.             /* if cursor size grows > 100, wrap around to small size */
  81.             cci.dwSize = (cci.dwSize + 10) % 100 + 1;
  82.             bSuccess = SetConsoleCursorInfo(hConOut, &cci);
  83.             PERR(bSuccess, "SetConsoleCursorInfo");
  84.             }
  85.           /* is the rightmost button is down? */
  86.           if (inputBuffer.Event.MouseEvent.dwButtonState ==
  87.               RIGHTMOST_BUTTON_PRESSED)
  88.             {
  89.             /* if cursor size < 0, wrap around to large size */
  90.             cci.dwSize -= 10;
  91.             if ((int) cci.dwSize < 1)
  92.               cci.dwSize = 100;
  93.             bSuccess = SetConsoleCursorInfo(hConOut, &cci);
  94.             PERR(bSuccess, "SetConsoleCursorInfo");
  95.             }
  96.           /* other buttons will be ignored */
  97.           }
  98.         break;
  99.       } /* switch */
  100.     }  /* while */
  101.   return;
  102. }