|
|
1.1 root 1: #include <windows.h>
2: #include "console.h"
3:
4: /* this is the sample text that we will place on the lower half of
5: the screen to scroll */
6:
7: static PCHAR szSampTxt =
8: "BOOL�ScrollConsoleScreenBuffer(�hConsoleOutput, lpScrollRectangle,\n"
9: " lpClipRectangle, dwDestinationOrigin,\n"
10: " lpFill)\n"
11: "HANDLE hConsoleOutput;\n"
12: "PSMALL_RECT lpScrollRectangle;\n"
13: "PSMALL_RECT lpClipRectangle;\n"
14: "COORD dwDestinationOrigin;\n"
15: "PCHAR_INFO lpFill;\n"
16: "\n"
17: "This function may be used to scroll the data in the screen buffer.\n"
18: "\n"
19: "Parameter Description\n"
20: "����������������������������������������������������������������������������\n"
21: "hConsoleOutput Supplies an open handle to console output.\n"
22: "lpScrollRectangle Pointer to region within screen buffer to move.\n"
23: "lpClipRectangle Pointer to region within screen buffer that may be\n"
24: " affected by this scroll. This pointer may be NULL.\n"
25: "dwDestinationOrigin Upper left corner of new location of ScrollRectangle\n"
26: " contents.\n"
27: "lpFill Pointer to structure containing new contents of\n"
28: " ScrollRectangle region.\n"
29: "\n"
30: "Return Value\n"
31: "The return value is TRUE if the function was successful, otherwise it is\n"
32: "FALSE in which case extended error information can be retrieved by calling\n"
33: "the GetLastError function.\n"
34: "\n"
35: "Comments\n"
36: "This function copies the contents of a rectangular region of the screen\n"
37: "buffer, the scroll region, to another area of the screen buffer, the target\n"
38: "region. The target region is defined as a rectangle the same dimensions as\n"
39: "the scroll region with the upper left corner at dwDestinationOrigin. Each\n"
40: "cell in the scroll region is then filled with the contents of Fill. Any\n"
41: "overlap between the scroll region and the target region is not filled. The\n"
42: "clip rectangle applies to changes made in both the ScrollRectangle and the\n"
43: "destination rectangle, i.e. if the clip rectangle does not include the\n"
44: "scroll rectangle, the scroll rectangle will not be updated with the contents";
45:
46:
47: /*******************************************************************
48: * FUNCTION: demoScrollCon(HANDLE hConOut) *
49: * *
50: * PURPOSE: demonstrate ScrollConsoleScreenBuffer. Scroll the lower *
51: * half of the console with each mouse click *
52: * *
53: * INPUT: the console output handle to scroll *
54: ********************************************************************/
55:
56: void demoScrollCon(HANDLE hConOut)
57: {
58: BOOL bSuccess;
59: INPUT_RECORD inputBuffer;
60: DWORD dwStdInMode;
61: HANDLE hStdIn;
62: DWORD dwInputEvents;
63: COORD coordDest; /* destination of scroll movement */
64: BOOL bDragMode = FALSE;
65: CHAR_INFO chiFill; /* char and attributes to fill empty space with */
66: CONSOLE_SCREEN_BUFFER_INFO csbi; /* used to get current attribute */
67: SMALL_RECT srctScrollRect; /* area of the screen to scroll */
68:
69: setConTitle(__FILE__);
70: myPuts(hConOut, "Let's use ScrollConsoleScreenBuffer to scroll the lower");
71: myPuts(hConOut, "half of the screen up with each mouse click. I'll fill the");
72: myPuts(hConOut, "screen with some sample text so you can see the effect.");
73: myPuts(hConOut, "Hit return to continue, and hit ESC at any time to return.\n");
74: myGetchar();
75: myPuts(hConOut, szSampTxt);
76: hStdIn = GetStdHandle(STD_INPUT_HANDLE);
77: PERR((int) hStdIn != -1,"GetStdHandle");
78: bSuccess = GetConsoleMode(hStdIn, &dwStdInMode);
79: PERR(bSuccess, "GetConsoleMode");
80: bSuccess = SetConsoleMode(hStdIn, dwStdInMode | ENABLE_MOUSE_INPUT);
81: PERR(bSuccess, "SetConsoleMode");
82: /* define region we want to move */
83: srctScrollRect.Top = getConY(hConOut) / 2;
84: srctScrollRect.Bottom = getConY(hConOut) - 1;
85: srctScrollRect.Left = 0;
86: srctScrollRect.Right = getConX(hConOut) - 1;
87: /* define origin where we want to move the scrolled region */
88: coordDest.X = 0;
89: coordDest.Y = (getConY(hConOut) / 2) - 1;
90: /* get current attributes and fill out CHAR_INFO structure for fill char */
91: bSuccess = GetConsoleScreenBufferInfo(hConOut, &csbi);
92: PERR(bSuccess, "GetConsoleScreenBufferInfo");
93: chiFill.Char.AsciiChar = ' ';
94: chiFill.Attributes = csbi.wAttributes;
95: for(;;)
96: {
97: bSuccess = ReadConsoleInput(hStdIn, &inputBuffer, 1, &dwInputEvents);
98: PERR(bSuccess, "ReadConsoleInput");
99: switch (inputBuffer.EventType)
100: {
101: case KEY_EVENT:
102: if (inputBuffer.Event.KeyEvent.bKeyDown &&
103: inputBuffer.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
104: {
105: /* set input mode back to what it was originally */
106: bSuccess = SetConsoleMode(hStdIn, dwStdInMode);
107: PERR(bSuccess, "SetConsoleMode");
108: return;
109: }
110: break;
111: case MOUSE_EVENT:
112: /* was this was a click or double click event? Is any button down? */
113: if (inputBuffer.Event.MouseEvent.dwEventFlags != MOUSE_MOVED &&
114: inputBuffer.Event.MouseEvent.dwButtonState)
115: {
116: bSuccess = ScrollConsoleScreenBuffer(hConOut,
117: &srctScrollRect,
118: NULL, /* no clipping rectangle */
119: coordDest, /* coordinates of destination */
120: &chiFill); /* attribute to fill empty space with */
121: PERR(bSuccess, "ScrollConsoleScreenBuffer");
122: }
123: break;
124: } /* switch */
125: } /* while */
126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.