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