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

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 <string.h>
  12. #include <malloc.h>
  13. #include "console.h"
  14. /*********************************************************************
  15. * FUNCTION: demoReadConChar(HANDLE hConOut)                          *
  16. *                                                                    *
  17. * PURPOSE: demonstrate ReadConsoleOutputCharacter. Read the text on  *
  18. *          line that the user clicks on and output it to the console *
  19. *                                                                    *
  20. * INPUT: the console output handle to write to                       *
  21. *********************************************************************/
  22. void demoReadConChar(HANDLE hConOut)
  23. {
  24.   BOOL bSuccess;
  25.   INPUT_RECORD inputBuffer;
  26.   DWORD dwStdInMode;
  27.   HANDLE hStdIn;
  28.   DWORD dwInputEvents;
  29.   COORD coordLine; /* coordinates of where to read characters from */
  30.   CHAR *szLine;  /* buffer to hold the line read from the console */
  31.   DWORD dwCharsRead;
  32.   int i;
  33.   setConTitle(__FILE__);
  34.   myPuts(hConOut, "Click on any line containing characters. I will usen"
  35.                   "ReadConsoleOutputCharacter to read that line of text inton"
  36.                   "a buffer, then print that buffer to the console at then"
  37.                   "current cursor position. Hit ESC to return.nn");
  38.   hStdIn = GetStdHandle(STD_INPUT_HANDLE);
  39.   PERR(hStdIn != INVALID_HANDLE_VALUE, "GetStdHandle");
  40.   /* save the console mode */
  41.   bSuccess = GetConsoleMode(hStdIn, &dwStdInMode);
  42.   PERR(bSuccess, "GetConsoleMode");
  43.   /* enable mouse input */
  44.   bSuccess = SetConsoleMode(hStdIn, dwStdInMode | ENABLE_MOUSE_INPUT);
  45.   PERR(bSuccess, "SetConsoleMode");
  46.   /* allocate space for one line */
  47.   szLine = (char *) malloc(getConX(hConOut));
  48.   PERR(szLine, "malloc");
  49.   for(;;)
  50.     {
  51.     /* get a single input event */
  52.     bSuccess = ReadConsoleInput(hStdIn, &inputBuffer, 1, &dwInputEvents);
  53.     PERR(bSuccess, "ReadConsoleInput");
  54.     switch (inputBuffer.EventType)
  55.       {
  56.       case KEY_EVENT:
  57.         /* is it an ESC key? */
  58.         if (inputBuffer.Event.KeyEvent.bKeyDown &&
  59.             inputBuffer.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
  60.           {
  61.           /* set input mode back to what it was originally and return */
  62.           bSuccess = SetConsoleMode(hStdIn, dwStdInMode);
  63.           PERR(bSuccess, "SetConsoleMode");
  64.           free(szLine); /* free allocated space for a text line */
  65.           return;
  66.           }
  67.         break;
  68.       case MOUSE_EVENT:
  69.         /* was this was a click event? Is any button down or not? */
  70.         if (inputBuffer.Event.MouseEvent.dwEventFlags != MOUSE_MOVED &&
  71.             inputBuffer.Event.MouseEvent.dwButtonState)
  72.           {
  73.           /* read the line where the mouse is, starting at column 0 */
  74.           coordLine.X = 0;
  75.           coordLine.Y = inputBuffer.Event.MouseEvent.dwMousePosition.Y;
  76.           bSuccess = ReadConsoleOutputCharacter(hConOut, szLine,
  77.               getConX(hConOut), coordLine, &dwCharsRead);
  78.           PERR(bSuccess, "ReadConsoleOutputCharacter");
  79.           /* strip trailing spaces */
  80.           i = getConX(hConOut) - 1;
  81.           szLine[i--] = 0; /* null terminate */
  82.           while (szLine[i] == ' ')
  83.             szLine[i--] = 0;
  84.           myPuts(hConOut, szLine);
  85.           }
  86.       } /* switch */
  87.     } /* while */
  88. }