Рисование в консоли windows на С++

В консоли windows можно рисовать как и в обычном окне. Для этого используется библиотека libgdi. Я использую Qt Creator, и для подключения библиотеки libgdi пришлось прописать в .pro файл проекта путь к libgdi32.a

LIBS += C:\Qt\Tools\mingw810_64\x86_64-w64-mingw32\lib\libgdi32.a
Нарисуем минималистичный рисунок в консоли, пусть это будет белая линия от начала координат (0, 0) в точку (300, 300). По умолчанию, перо которым рисуется в консоли - черного цвета и на черном цвете консоли трудно различимо, поэтому у нас добавляется несколько строчек по созданию белого пера и привязки его к консольному окну. Также возникла ситуация что рисунок появлялся в консоли не при каждом запуске программы, было сделано предположение что рисует быстрее чем заканчиваются вывод консоли на экран и перерисовки консоли стирают рисунок. Предположение подтвердилось путем введения задержки после запуска функцией Sleep(100) и получением стабильной отрисовки.

#include <windows.h>        // GetConsoleWindow(), GetDC()...

int main(){
    Sleep(100);             // Задержка 100 мс, без этого, иногда, перерисовка окна затирает рисунок
    HWND hwnd = GetConsoleWindow(); // Находим дескриптор (handle) консольного окна
    HDC hdc = GetDC(hwnd);  // Находим контекст устройства DC - device context
    HPEN hPen = CreatePen(PS_SOLID, 5, RGB(255, 255,  255));  // Создаем (сплошное перо, толщиной 5 пикселов, белого цвета)
    SelectObject(hdc, hPen);// Привязываем перо к экрану
    LineTo(hdc, 300, 300);  // Рисуем линию от текущих координат (0, 0) к (300, 300)
}

Результат работы программы.
Рисование линии в консоли С++

Усложним задачу и нарисуем толстыми, цветными, градиентными линиями синус.


#include <windows.h>        // GetConsoleWindow(), GetDC()...
#include <iostream>         // std::cout
#include <cmath>            // sin()
#include <cstdlib>          // system()

int main(){
    system("chcp 65001");   // Active code page: 65001 (Устанавливает UTF-8)
    system("cls");          // Очищает окно от предыдущего вывода
    HWND hwnd = GetConsoleWindow();                 // Находим дескриптор (handle) консольного окна
    HDC hdc = GetDC(hwnd);                          // Находим контекст устройства DC - device context
    int x = 0;                                      // Координата x
    for (float i = 0; i < 3.14 * 30; i += 0.05){    // Итерации рисования
        int R = fabs(sin(i * 1.3 - 0.3)) * 255;     // Циклически меняем значение цвета
        int G = fabs(sin(i * 1.1 - 0.5)) * 255;     // Циклически меняем значение цвета
        int B = fabs(sin(i * 1.7 - 0.7)) * 255;     // Циклически меняем значение цвета
        COLORREF color = RGB(R, G,  B);             // Цвет (R, G, B) 0...255 Меняем цвет в процессе
        HPEN hPen = CreatePen(PS_SOLID, 5, color);  // Создаем перо
        SelectObject(hdc, hPen);                    // Привязываем перо к экрану
        int y = 350 - 340 * sin(i);                 // Координата y
        LineTo(hdc, x, y);                          // Рисуем линию
        x += 1;                                     // Увеличиваем x для рисования следующей точки
        DeleteObject(hPen);                         // Освобождаем ресурсы
    }
    ReleaseDC(hwnd, hdc);                           // Освобождаем ресурсы
    std::cout << "Рисуем в консоли";                // Выводим текст
    return 0;
}

Результат работы программы.
Рисование градиентного синуса в консоли С++

2023-10-23



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

Ассемблерный листинг С++
Бенчмарки в С++
Рисование в консоли windows на С++
Функции в С++
Параметры функции в С++
Глоссарий С++. Идентификаторы, квалификаторы, модификаторы, объявление, определение и т.д..
Исключения в С++. Выбрасывание и ловля исключения.
Достоинства и недостатки C++
Сборка приложения без IDE C++ с помощью MinGW и Qt
Перегрузка функций и операторов в С++
Случайные числа в С++. Полиномиальная генерация случайных чисел.
Ссылки в С++
Рекурсия в С++. Примеры рекурсивных программ и без использования.
Шаблоны C++
Наименование переменных и стиль программирования
Версия компилятора С++
Время выполнения программы C++