home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winui / console / fillatt.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  11KB  |  233 lines

  1.  
  2. /******************************************************************************\
  3. *       This is a part of the Microsoft Source Code Samples. 
  4. *       Copyright (C) 1993-1997 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.  
  12. #include <windows.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include "console.h"
  16.  
  17. #pragma setlocale(".1252")
  18.  
  19. /* number of colors in the color bar */
  20. #define MAXCOLORS 16
  21. /* horizontal size in characters of the sample text area */
  22. #define SAMPTEXTX 33
  23. /* veritcal size in characters of the sample text area */
  24. #define SAMPTEXTY 5
  25.  
  26. /********************************************************************
  27. * FUNCTION: demoFillAtt(HANDLE hConOut)                             *
  28. *                                                                   *
  29. * PURPOSE: demonstrate FillConsoleOutputAttribute and               *
  30. *          WriteConsoleOutputCharacter. Create a console version of *
  31. *          the "ScreenSize..." menu item from the console system    *
  32. *          menu. Allow the user to select a foreground and          *
  33. *          background color, which will be immediately displayed in *
  34. *          the sample text box                                      *
  35. *                                                                   *
  36. * INPUT: the console output handle to write to                      *
  37. ********************************************************************/
  38.  
  39. void demoFillAtt(HANDLE hConOut)
  40. {
  41.   COORD foregLoc = {5, 5}; /* foreground 'button' location */
  42.   COORD backgLoc = {5, 7}; /* background 'button' location */
  43.   COORD okLoc = {20, 5}; /* ok 'button' location */
  44.   COORD colorbarLoc = {6, 10};  /* loc of first color in colorbar */
  45.   COORD sampleLoc = {5, 13}; /* sample text location */
  46.   COORD dwBufCoord; /* temp COORD structure */
  47.   BOOL bSuccess;
  48.   PCHAR szForeg = "■ Screen Text"; /* foreground 'button' and text */
  49.   PCHAR szBackg = "■ Screen Background"; /* background 'button' */
  50.   PCHAR szOk = "■ OK"; /* OK 'button' */
  51.   /* these strings are the box around the color bar */
  52.   PCHAR szColors1 = "┌────────────────────────────────┐";
  53.   PCHAR szColors2 = "│                                │";
  54.   PCHAR szColors3 = "└────────────────────────────────┘";
  55.   WORD wButtonColor; /* holds the button 'color' */
  56.   DWORD dwCharsWritten;
  57.   WORD i;
  58.   INPUT_RECORD inputBuf;
  59.   DWORD cInputEvents;
  60.   BOOL bForeground; /* state flag: foreground button active? */
  61.   COORD wCurPos;
  62.   HANDLE hStdIn;
  63.   /* arraw of attributes to put in the colorbar, each attribute in 2 spaces */
  64.   WORD szAttr[MAXCOLORS * 2];
  65.   PCHAR szSampText = "A console consists of a keyboard and mouse input buffer"
  66.                   " and one or more screen buffers.  \"CONIN$\" refers to the"
  67.                   " input buffer. Stdin is a handle to \"CONIN$\".  \"CONOUT$\""
  68.                   " refers to a screen buffer.";
  69.   PCHAR p;
  70.   WORD wCurSampAttr; /* current attribute of the sample text area */
  71.  
  72.   setConTitle(__FILE__);
  73.   /* place our "buttons" and text on the screen. First the 'foreground' */
  74.   /* button... */
  75.   bSuccess = WriteConsoleOutputCharacter(hConOut, szForeg, strlen(szForeg),
  76.       foregLoc, &dwCharsWritten);
  77.   /* now the 'background' button */
  78.   PERR(bSuccess, "WriteConsoleOutputCharacter");
  79.   bSuccess = WriteConsoleOutputCharacter(hConOut, szBackg, strlen(szBackg),
  80.       backgLoc, &dwCharsWritten);
  81.   /* place the 'OK' button */
  82.   PERR(bSuccess, "WriteConsoleOutputCharacter");
  83.   bSuccess = WriteConsoleOutputCharacter(hConOut, szOk, strlen(szOk),
  84.       okLoc, &dwCharsWritten);
  85.   PERR(bSuccess, "WriteConsoleOutputCharacter");
  86.   /* now let's draw a boxed colorbar */
  87.   dwBufCoord = colorbarLoc;
  88.   /* move up and left one to draw a box around the colorbar */
  89.   dwBufCoord.X--;
  90.   dwBufCoord.Y--;
  91.   /* the top of the box */
  92.   bSuccess = WriteConsoleOutputCharacter(hConOut, szColors1, strlen(szColors1),
  93.       dwBufCoord, &dwCharsWritten);
  94.   PERR(bSuccess, "WriteConsoleOutputCharacter");
  95.   dwBufCoord.Y++;
  96.   /* the middle of the box */
  97.   bSuccess = WriteConsoleOutputCharacter(hConOut, szColors2, strlen(szColors2),
  98.       dwBufCoord, &dwCharsWritten);
  99.   PERR(bSuccess, "WriteConsoleOutputCharacter");
  100.   dwBufCoord.Y++;
  101.   /* the bottom of the box */
  102.   bSuccess = WriteConsoleOutputCharacter(hConOut, szColors3, strlen(szColors3),
  103.       dwBufCoord, &dwCharsWritten);
  104.   PERR(bSuccess, "WriteConsoleOutputCharacter");
  105.  
  106.   /* color the "buttons" a different color */
  107.   wButtonColor = FOREGROUND_WHITE | BACKGROUND_WHITE;
  108.   /* color the 'backgroud' button */
  109.   bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
  110.       1, backgLoc, &dwCharsWritten);
  111.   PERR(bSuccess, "WriteConsoleOutputAttribute");
  112.   /* color the 'OK' button */
  113.   bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
  114.       1, okLoc, &dwCharsWritten);
  115.   PERR(bSuccess, "WriteConsoleOutputAttribute");
  116.   /* color the 'foreground' button, but with a different color */
  117.   wButtonColor = BACKGROUND_WHITE;
  118.   bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
  119.       1, foregLoc, &dwCharsWritten);
  120.   PERR(bSuccess, "WriteConsoleOutputAttribute");
  121.   bForeground = TRUE; /* the 'foreground' button is 'highlighted' */
  122.  
  123.   /* construct the attribute string */
  124.   for (i = 0; i < MAXCOLORS; i++)
  125.     /* for each set of two, the color attributes are in the high byte */
  126.     /* of the word - shift them into the high byte */
  127.     szAttr[i * 2] = szAttr[(i * 2) + 1] = i << 4;
  128.   /* write out the attributes at the colorbar location */
  129.   dwBufCoord = colorbarLoc;
  130.   bSuccess = WriteConsoleOutputAttribute(hConOut, szAttr, MAXCOLORS * 2,
  131.       dwBufCoord, &dwCharsWritten);
  132.   PERR(bSuccess, "WriteConsoleOutputAttribute");
  133.  
  134.   /* put up a sample text area */
  135.   p = szSampText;
  136.   wCurPos = sampleLoc;
  137.   wCurSampAttr = BACKGROUND_WHITE;
  138.   for (i = 0; i < SAMPTEXTY; i++)
  139.     {
  140.     bSuccess = WriteConsoleOutputCharacter(hConOut, p,
  141.         min(strlen(p), SAMPTEXTX), wCurPos, &dwCharsWritten);
  142.     PERR(bSuccess, "WriteConsoleOutputCharacter");
  143.     /* color the text with the current sample attribute */
  144.     bSuccess = FillConsoleOutputAttribute(hConOut, wCurSampAttr, SAMPTEXTX,
  145.         wCurPos, &dwCharsWritten);
  146.     PERR(bSuccess, "FillConsoleOutputAttribute");
  147.     wCurPos.Y++;
  148.     /* advance pointer to the next row of characters in the sample string */
  149.     p += min(strlen(p), SAMPTEXTX);
  150.     }
  151.  
  152.   hStdIn = GetStdHandle(STD_INPUT_HANDLE);
  153.   PERR(hStdIn != INVALID_HANDLE_VALUE, "GetStdHandle");
  154.   for(;;)
  155.     {
  156.     /* get an input event */
  157.     bSuccess = ReadConsoleInput(hStdIn, &inputBuf, 1, &cInputEvents);
  158.     /* if it's a mouse event but not a mouse move, it's a click */
  159.     PERR(bSuccess, "ReadConsoleInput");
  160.     if (inputBuf.EventType == MOUSE_EVENT &&
  161.         inputBuf.Event.MouseEvent.dwEventFlags != MOUSE_MOVED)
  162.       {
  163.       wCurPos = inputBuf.Event.MouseEvent.dwMousePosition;
  164.       /* is the mouse on the 'foreground' button? */
  165.       if (wCurPos.X == foregLoc.X && wCurPos.Y == foregLoc.Y)
  166.         {
  167.         bForeground = TRUE;
  168.         /* recolor the background color and foreground color */
  169.         /* of the foreground to show the foreground button active */
  170.         wButtonColor = BACKGROUND_WHITE;
  171.         bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
  172.             1, foregLoc, &dwCharsWritten);
  173.         PERR(bSuccess, "WriteConsoleOutputAttribute");
  174.         /* recolor the background color to show as inactive */
  175.         wButtonColor = FOREGROUND_WHITE | BACKGROUND_WHITE;
  176.         bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
  177.             1, backgLoc, &dwCharsWritten);
  178.         PERR(bSuccess, "WriteConsoleOutputAttribute");
  179.         }
  180.       /* is the mouse on the 'background' button? */
  181.       if (wCurPos.X == backgLoc.X && wCurPos.Y == backgLoc.Y)
  182.         {
  183.         bForeground = FALSE;
  184.         /* recolor the background button to show as active */
  185.         wButtonColor = BACKGROUND_WHITE;
  186.         bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
  187.             1, backgLoc, &dwCharsWritten);
  188.         PERR(bSuccess, "WriteConsoleOutputAttribute");
  189.         /* recolor the foreground button to show as inactive */
  190.         wButtonColor = FOREGROUND_WHITE | BACKGROUND_WHITE;
  191.         bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
  192.             1, foregLoc, &dwCharsWritten);
  193.         PERR(bSuccess, "WriteConsoleOutputAttribute");
  194.         }
  195.       /* is the mouse on the 'OK' button? */
  196.       if (wCurPos.X == okLoc.X && wCurPos.Y == okLoc.Y)
  197.         break;
  198.       /* is the mouse in the colorbar? */
  199.       if (wCurPos.Y == colorbarLoc.Y && wCurPos.X >= colorbarLoc.X &&
  200.           wCurPos.X < colorbarLoc.X + (SHORT) (MAXCOLORS * 2))
  201.         {
  202.         /* get the screen attribute at the mouse position */
  203.         bSuccess = ReadConsoleOutputAttribute(hConOut, &wButtonColor,
  204.             sizeof(wButtonColor), wCurPos, &dwCharsWritten);
  205.         PERR(bSuccess, "ReadConsoleOutputAttribute");
  206.         /* if the foreground button is active, set the foreground */
  207.         /* attribute for the sample text */
  208.         if (bForeground)
  209.           /* mask off the foreground color and 'or' it with the color */
  210.           /* we just got from the screen, shifted up to make it a */
  211.           /* foreground color (it's actually a background attribute when */
  212.           /* read from the console buffer). */
  213.           wCurSampAttr = (wCurSampAttr & (WORD) 0xF0) | (wButtonColor >> 4);
  214.         /* otherwise set the background attribute for the sample text */
  215.         else
  216.           /* mask off the background color and 'or'  it with the background */
  217.           /* color we just read from the console. */
  218.           wCurSampAttr = (wCurSampAttr & (WORD) 0x0F) | wButtonColor;
  219.         /* now set the attribute of the sample text to the new attribute */
  220.         wCurPos = sampleLoc;
  221.         for (i = 0; i < SAMPTEXTY; i++)
  222.           {
  223.           bSuccess = FillConsoleOutputAttribute(hConOut, wCurSampAttr,
  224.               SAMPTEXTX, wCurPos, &dwCharsWritten);
  225.           PERR(bSuccess, "FillConsoleOutputAttribute");
  226.           wCurPos.Y++;
  227.           }
  228.         }  /* if */
  229.       }  /* if */
  230.     }  /* while */
  231.   return;
  232. }
  233.