Annotation of mstools/samples/console/create.c, revision 1.1.1.3

1.1.1.3 ! root        1: 
        !             2: /******************************************************************************\
        !             3: *       This is a part of the Microsoft Source Code Samples. 
        !             4: *       Copyright (C) 1993 Microsoft Corporation.
        !             5: *       All rights reserved. 
        !             6: *       This source code is only intended as a supplement to 
        !             7: *       Microsoft Development Tools and/or WinHelp documentation.
        !             8: *       See these sources for detailed information regarding the 
        !             9: *       Microsoft samples programs.
        !            10: \******************************************************************************/
        !            11: 
1.1       root       12: #include <windows.h>
                     13: #include <stdio.h>
                     14: #include "console.h"
                     15: 
                     16: /*********************************************************************
                     17: * FUNCTION: demoCreate(HANDLE hConOld)                               *
                     18: *                                                                    *
                     19: * PURPOSE: demonstrate CreateConsoleScreenBuffer,                    *
                     20: *          SetConsoleTextAttribute, and                              *
                     21: *          SetConsoleActiveScreenBuffer. Create a 'help' screen on a *
                     22: *          new buffer and quickly switch between the main buffer and *
                     23: *          the help buffer on command without redrawing the entire   *
                     24: *          screens. SetConsoleTextAttribute will be used to make the *
                     25: *          help screen a different color.                            *
                     26: *                                                                    *
                     27: * INPUT: the output handle to write to                               *
                     28: **********************************************************************/
                     29: 
                     30: void demoCreate(HANDLE hConOld)
                     31: {
                     32:   BOOL bSuccess;
                     33:   HANDLE hConHelp; /* console for the help screen */
                     34:   COORD dwWriteCoord = {0, 0}; /* where to write the screen attributes */
                     35:   DWORD cCharsWritten;
                     36:   HANDLE hStdIn; /* standard input handle */
                     37:   CHAR c = 0; /* virtual key code that we will read */
                     38:   HANDLE hConCurrent; /* keep track of the current visible console buffer */
                     39:   INPUT_RECORD inputBuf; /* console input event record */
                     40:   DWORD cInputEvents;
                     41: 
                     42:   setConTitle(__FILE__);
                     43:   myPuts(hConOld, "Let's create a help screen in another buffer. Then\n"
                     44:                   "when the user hits F1, we can easily flip to the help\n"
                     45:                   "screen and back without recreating the text on the\n"
                     46:                   "screens by simply changing the active buffer.\n"
                     47:                   "We'll change the default text attribute with\n"
                     48:                   "SetConsoleTextAttribute before creating the help screen\n"
                     49:                   "so that the sample text is in a different color.\n"
                     50:                   "Hit F1 now for help, and esc to return here.\n"
                     51:                   "Hit esc from this screen to return to API list.");
                     52:   /* create a separate console buffer for the help screen */
                     53:   hConHelp = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,
                     54:       FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER,
                     55:       NULL);
1.1.1.2   root       56:   PERR(hConHelp != INVALID_HANDLE_VALUE, "CreateConsoleScreenBuffer");
1.1       root       57:   /* change the color of the help screen */
                     58:   bSuccess = FillConsoleOutputAttribute(hConHelp, BACKGROUND_BLUE,
                     59:       getConX(hConHelp) * getConY(hConHelp), dwWriteCoord, &cCharsWritten);
                     60:   PERR(bSuccess, "FillConsoleOutputAttribute");
                     61:   /* set the color for future text output */
                     62:   bSuccess = SetConsoleTextAttribute(hConHelp, FOREGROUND_YELLOW |
                     63:       FOREGROUND_INTENSITY | BACKGROUND_BLUE);
                     64:   PERR(bSuccess, "SetConsoleTextAttribute");
                     65:   myPuts(hConHelp, "                S u p e r D u p e r B a s e   H e l p\n"
                     66:                    "\n\n                  F1: search        F6: window\n"
                     67:                    "                  F2: extract       F7: initialize\n"
                     68:                    "                  F3: sort          F8: exit\n"
                     69:                    "                  F4: query         F9: save\n"
                     70:                    "                  F5: execute       F10: explode\n"
                     71:                    "                  ESC: exit help");
                     72:   hStdIn = GetStdHandle(STD_INPUT_HANDLE);
1.1.1.2   root       73:   PERR(hStdIn != INVALID_HANDLE_VALUE, "GetStdHandle");
1.1       root       74:   /* keep track of the currently visible console */
                     75:   hConCurrent = hConOld;
                     76:   /* switch between the help and previous buffer when user hits F1 or ESC */
                     77:   for(;;)
                     78:     {
                     79:     do
                     80:       {
                     81:       /* throw away any non-keystroke events or any key-up events */
                     82:       bSuccess = ReadConsoleInput(hStdIn, &inputBuf, 1, &cInputEvents);
                     83:       PERR(bSuccess, "ReadConsoleInput");
                     84:       } while (inputBuf.EventType != KEY_EVENT ||
                     85:           !inputBuf.Event.KeyEvent.bKeyDown);
                     86:     /* get the virtual scan code of the key-down event */
                     87:     c = (char) inputBuf.Event.KeyEvent.wVirtualKeyCode;
                     88:     switch(c)
                     89:       {
                     90:       case VK_F1:
                     91:         /* if the current buffer is the original buffer, switch to the */
                     92:         /* help buffer */
                     93:         if (hConCurrent == hConOld)
                     94:           {
                     95:           bSuccess = SetConsoleActiveScreenBuffer(hConHelp);
                     96:           PERR(bSuccess, "SetConsoleActiveScreenBuffer");
                     97:           hConCurrent = hConHelp;
                     98:           }
                     99:         break;
                    100:       case VK_ESCAPE:
                    101:         /* if the current buffer is the help buffer, switch to the */
                    102:         /* original buffer. Otherwise, clean up and return */
                    103:         if (hConCurrent == hConHelp)
                    104:           {
                    105:           bSuccess = SetConsoleActiveScreenBuffer(hConOld);
                    106:           PERR(bSuccess, "SetConsoleActiveScreenBuffer");
                    107:           hConCurrent = hConOld;
                    108:           }
                    109:         else
                    110:           {
                    111:           CloseHandle(hConHelp);
                    112:           return;
                    113:           }
                    114:         break;
                    115:       case VK_F10:
                    116:         if (hConCurrent == hConHelp)
                    117:           myPuts(hConHelp, "BOOM!");
                    118:         break;
                    119:       default:
                    120:         break;
                    121:       }  /* switch */
                    122:     }  /* while */
                    123:   return;
                    124: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.