home *** CD-ROM | disk | FTP | other *** search
-
- /******************************************************************************\
- * This is a part of the Microsoft Source Code Samples.
- * Copyright (C) 1993-1997 Microsoft Corporation.
- * All rights reserved.
- * This source code is only intended as a supplement to
- * Microsoft Development Tools and/or WinHelp documentation.
- * See these sources for detailed information regarding the
- * Microsoft samples programs.
- \******************************************************************************/
-
- #include <windows.h>
- #include <stdio.h>
- #include <string.h>
- #include "console.h"
-
- #pragma setlocale(".1252")
-
- /* number of colors in the color bar */
- #define MAXCOLORS 16
- /* horizontal size in characters of the sample text area */
- #define SAMPTEXTX 33
- /* veritcal size in characters of the sample text area */
- #define SAMPTEXTY 5
-
- /********************************************************************
- * FUNCTION: demoFillAtt(HANDLE hConOut) *
- * *
- * PURPOSE: demonstrate FillConsoleOutputAttribute and *
- * WriteConsoleOutputCharacter. Create a console version of *
- * the "ScreenSize..." menu item from the console system *
- * menu. Allow the user to select a foreground and *
- * background color, which will be immediately displayed in *
- * the sample text box *
- * *
- * INPUT: the console output handle to write to *
- ********************************************************************/
-
- void demoFillAtt(HANDLE hConOut)
- {
- COORD foregLoc = {5, 5}; /* foreground 'button' location */
- COORD backgLoc = {5, 7}; /* background 'button' location */
- COORD okLoc = {20, 5}; /* ok 'button' location */
- COORD colorbarLoc = {6, 10}; /* loc of first color in colorbar */
- COORD sampleLoc = {5, 13}; /* sample text location */
- COORD dwBufCoord; /* temp COORD structure */
- BOOL bSuccess;
- PCHAR szForeg = "■ Screen Text"; /* foreground 'button' and text */
- PCHAR szBackg = "■ Screen Background"; /* background 'button' */
- PCHAR szOk = "■ OK"; /* OK 'button' */
- /* these strings are the box around the color bar */
- PCHAR szColors1 = "┌────────────────────────────────┐";
- PCHAR szColors2 = "│ │";
- PCHAR szColors3 = "└────────────────────────────────┘";
- WORD wButtonColor; /* holds the button 'color' */
- DWORD dwCharsWritten;
- WORD i;
- INPUT_RECORD inputBuf;
- DWORD cInputEvents;
- BOOL bForeground; /* state flag: foreground button active? */
- COORD wCurPos;
- HANDLE hStdIn;
- /* arraw of attributes to put in the colorbar, each attribute in 2 spaces */
- WORD szAttr[MAXCOLORS * 2];
- PCHAR szSampText = "A console consists of a keyboard and mouse input buffer"
- " and one or more screen buffers. \"CONIN$\" refers to the"
- " input buffer. Stdin is a handle to \"CONIN$\". \"CONOUT$\""
- " refers to a screen buffer.";
- PCHAR p;
- WORD wCurSampAttr; /* current attribute of the sample text area */
-
- setConTitle(__FILE__);
- /* place our "buttons" and text on the screen. First the 'foreground' */
- /* button... */
- bSuccess = WriteConsoleOutputCharacter(hConOut, szForeg, strlen(szForeg),
- foregLoc, &dwCharsWritten);
- /* now the 'background' button */
- PERR(bSuccess, "WriteConsoleOutputCharacter");
- bSuccess = WriteConsoleOutputCharacter(hConOut, szBackg, strlen(szBackg),
- backgLoc, &dwCharsWritten);
- /* place the 'OK' button */
- PERR(bSuccess, "WriteConsoleOutputCharacter");
- bSuccess = WriteConsoleOutputCharacter(hConOut, szOk, strlen(szOk),
- okLoc, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputCharacter");
- /* now let's draw a boxed colorbar */
- dwBufCoord = colorbarLoc;
- /* move up and left one to draw a box around the colorbar */
- dwBufCoord.X--;
- dwBufCoord.Y--;
- /* the top of the box */
- bSuccess = WriteConsoleOutputCharacter(hConOut, szColors1, strlen(szColors1),
- dwBufCoord, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputCharacter");
- dwBufCoord.Y++;
- /* the middle of the box */
- bSuccess = WriteConsoleOutputCharacter(hConOut, szColors2, strlen(szColors2),
- dwBufCoord, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputCharacter");
- dwBufCoord.Y++;
- /* the bottom of the box */
- bSuccess = WriteConsoleOutputCharacter(hConOut, szColors3, strlen(szColors3),
- dwBufCoord, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputCharacter");
-
- /* color the "buttons" a different color */
- wButtonColor = FOREGROUND_WHITE | BACKGROUND_WHITE;
- /* color the 'backgroud' button */
- bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
- 1, backgLoc, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputAttribute");
- /* color the 'OK' button */
- bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
- 1, okLoc, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputAttribute");
- /* color the 'foreground' button, but with a different color */
- wButtonColor = BACKGROUND_WHITE;
- bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
- 1, foregLoc, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputAttribute");
- bForeground = TRUE; /* the 'foreground' button is 'highlighted' */
-
- /* construct the attribute string */
- for (i = 0; i < MAXCOLORS; i++)
- /* for each set of two, the color attributes are in the high byte */
- /* of the word - shift them into the high byte */
- szAttr[i * 2] = szAttr[(i * 2) + 1] = i << 4;
- /* write out the attributes at the colorbar location */
- dwBufCoord = colorbarLoc;
- bSuccess = WriteConsoleOutputAttribute(hConOut, szAttr, MAXCOLORS * 2,
- dwBufCoord, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputAttribute");
-
- /* put up a sample text area */
- p = szSampText;
- wCurPos = sampleLoc;
- wCurSampAttr = BACKGROUND_WHITE;
- for (i = 0; i < SAMPTEXTY; i++)
- {
- bSuccess = WriteConsoleOutputCharacter(hConOut, p,
- min(strlen(p), SAMPTEXTX), wCurPos, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputCharacter");
- /* color the text with the current sample attribute */
- bSuccess = FillConsoleOutputAttribute(hConOut, wCurSampAttr, SAMPTEXTX,
- wCurPos, &dwCharsWritten);
- PERR(bSuccess, "FillConsoleOutputAttribute");
- wCurPos.Y++;
- /* advance pointer to the next row of characters in the sample string */
- p += min(strlen(p), SAMPTEXTX);
- }
-
- hStdIn = GetStdHandle(STD_INPUT_HANDLE);
- PERR(hStdIn != INVALID_HANDLE_VALUE, "GetStdHandle");
- for(;;)
- {
- /* get an input event */
- bSuccess = ReadConsoleInput(hStdIn, &inputBuf, 1, &cInputEvents);
- /* if it's a mouse event but not a mouse move, it's a click */
- PERR(bSuccess, "ReadConsoleInput");
- if (inputBuf.EventType == MOUSE_EVENT &&
- inputBuf.Event.MouseEvent.dwEventFlags != MOUSE_MOVED)
- {
- wCurPos = inputBuf.Event.MouseEvent.dwMousePosition;
- /* is the mouse on the 'foreground' button? */
- if (wCurPos.X == foregLoc.X && wCurPos.Y == foregLoc.Y)
- {
- bForeground = TRUE;
- /* recolor the background color and foreground color */
- /* of the foreground to show the foreground button active */
- wButtonColor = BACKGROUND_WHITE;
- bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
- 1, foregLoc, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputAttribute");
- /* recolor the background color to show as inactive */
- wButtonColor = FOREGROUND_WHITE | BACKGROUND_WHITE;
- bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
- 1, backgLoc, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputAttribute");
- }
- /* is the mouse on the 'background' button? */
- if (wCurPos.X == backgLoc.X && wCurPos.Y == backgLoc.Y)
- {
- bForeground = FALSE;
- /* recolor the background button to show as active */
- wButtonColor = BACKGROUND_WHITE;
- bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
- 1, backgLoc, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputAttribute");
- /* recolor the foreground button to show as inactive */
- wButtonColor = FOREGROUND_WHITE | BACKGROUND_WHITE;
- bSuccess = WriteConsoleOutputAttribute(hConOut, &wButtonColor,
- 1, foregLoc, &dwCharsWritten);
- PERR(bSuccess, "WriteConsoleOutputAttribute");
- }
- /* is the mouse on the 'OK' button? */
- if (wCurPos.X == okLoc.X && wCurPos.Y == okLoc.Y)
- break;
- /* is the mouse in the colorbar? */
- if (wCurPos.Y == colorbarLoc.Y && wCurPos.X >= colorbarLoc.X &&
- wCurPos.X < colorbarLoc.X + (SHORT) (MAXCOLORS * 2))
- {
- /* get the screen attribute at the mouse position */
- bSuccess = ReadConsoleOutputAttribute(hConOut, &wButtonColor,
- sizeof(wButtonColor), wCurPos, &dwCharsWritten);
- PERR(bSuccess, "ReadConsoleOutputAttribute");
- /* if the foreground button is active, set the foreground */
- /* attribute for the sample text */
- if (bForeground)
- /* mask off the foreground color and 'or' it with the color */
- /* we just got from the screen, shifted up to make it a */
- /* foreground color (it's actually a background attribute when */
- /* read from the console buffer). */
- wCurSampAttr = (wCurSampAttr & (WORD) 0xF0) | (wButtonColor >> 4);
- /* otherwise set the background attribute for the sample text */
- else
- /* mask off the background color and 'or' it with the background */
- /* color we just read from the console. */
- wCurSampAttr = (wCurSampAttr & (WORD) 0x0F) | wButtonColor;
- /* now set the attribute of the sample text to the new attribute */
- wCurPos = sampleLoc;
- for (i = 0; i < SAMPTEXTY; i++)
- {
- bSuccess = FillConsoleOutputAttribute(hConOut, wCurSampAttr,
- SAMPTEXTX, wCurPos, &dwCharsWritten);
- PERR(bSuccess, "FillConsoleOutputAttribute");
- wCurPos.Y++;
- }
- } /* if */
- } /* if */
- } /* while */
- return;
- }
-