Очистка части окна в консоли - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Уважаемые умельцы-программисты. Скажите, пожалуйста, как очистить только часть окна в консоли, либо как сохранить часть содержимого окна при очистке. Поясняю, функция system ("CLS") отчищает все окно. а мне нужно, чтобы оно оставляло какую-то произволную его часть. Буду очень благодарен за помощь)

Решение задачи: «Очистка части окна в консоли»

textual
Листинг программы
#include <stdio.h>
#include <Windows.h>
 
void ClearRow(int X, int Y, int rowWidth)
{ HANDLE                     hStdOut;
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  DWORD                      count;
  COORD                      homeCoords = {X,Y};
 
  hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
  if (hStdOut == INVALID_HANDLE_VALUE) return;
 
  if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
 
  // Fill the row with spaces
  if (!FillConsoleOutputCharacter(
    hStdOut,
    (TCHAR) ' ',
    rowWidth,
    homeCoords,
    &count
    )) return;
 
  //Fill the row with the current colors and attributes
  if (!FillConsoleOutputAttribute(
    hStdOut,
    csbi.wAttributes,
    rowWidth,
    homeCoords,
    &count
    )) return;
 
  //Move the cursor home
  SetConsoleCursorPosition( hStdOut, homeCoords );
}
 
void ClearRectangle(int X1, int Y1, int X2, int Y2)
{   while(Y1<Y2)
        ClearRow(X1, Y1++, X2-X1);
}
 
int main()
{   int i;
    for(i=0;i<2000;i++)
        printf("*");
    
    ClearRectangle(20,10,40,20);//< - clear the rectangle
 
    getchar(); 
    return 0;
}

Объяснение кода листинга программы

  1. #include Включает стандартную библиотеку ввода-вывода, необходимую для отправки сообщений в консоль.
  2. #include Включает библиотеку Windows, которая содержит функции для работы с консолью.
  3. void ClearRow(int X, int Y, int rowWidth) Определяет функцию, которая очищает указанную строку в консоли.
  4. HANDLE hStdOut; Объявляет переменную типа HANDLE, которая будет использоваться для работы с консолью.
  5. CONSOLE_SCREEN_BUFFER_INFO csbi; Объявляет структуру, которая содержит информацию о буфере консоли.
  6. DWORD count; Объявляет переменную типа DWORD, которая будет использоваться для подсчета количества записанных символов.
  7. COORD homeCoords = {X,Y}; Объявляет структуру COORD, которая содержит координаты курсора.
  8. hStdOut = GetStdHandle( STD_OUTPUT_HANDLE ); Получает дескриптор стандартного вывода.
  9. if (hStdOut == INVALID_HANDLE_VALUE) return; Проверяет, не является ли дескриптор недействительным, и возвращает управление, если это так.
  10. if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return; Получает информацию о буфере консоли.
  11. // Fill the row with spaces Заполняет указанную строку пробелами.
  12. if (!FillConsoleOutputCharacter( hStdOut, (TCHAR) ' ', rowWidth, homeCoords, &count )) return;
  13. //Fill the row with the current colors and attributes Заполняет указанную строку текущими цветами и атрибутами.
  14. if (!FillConsoleOutputAttribute( hStdOut, csbi.wAttributes, rowWidth, homeCoords, &count )) return;
  15. //Move the cursor home Перемещает курсор в начало указанной строки.
  16. SetConsoleCursorPosition( hStdOut, homeCoords );
  17. void ClearRectangle(int X1, int Y1, int X2, int Y2) Определяет функцию, которая очищает указанный прямоугольник в консоли.
  18. for(i=Y1;i<Y2;i++) Использует цикл для очистки каждой строки в прямоугольнике.
  19. ClearRow(X1, Y1++, X2-X1); Вызывает функцию ClearRow для очистки текущей строки.
  20. int main() Определяет точку входа в программу.
  21. int i; Объявляет переменную типа int для цикла.
  22. for(i=0;i<2000;i++) Использует цикл для вывода 2000 символов *.
  23. *printf(`);** Выводит символ*` в консоль.
  24. ClearRectangle(20,10,40,20); Вызывает функцию ClearRectangle для очистки прямоугольника.
  25. getchar(); Получает символ от пользователя и предотвращает закрытие консоли.
  26. return 0; Завершает программу.

Оцени полезность:

11   голосов , оценка 4 из 5