|
|
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.