C++ Вопрос Как отрисовать цвет по Hex значению в консольном приложении?

Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
Всем доброй ночи.

Делаю проект маленький, и не могу сделать цвет который будет привязан к моему Hex значению.
Как можно это реализовать?

Мой код:
My Code:
#include <iostream> // hex func, and main func.
#include <string.h> // for hex #
#include <Windows.h> // for show Console
#include <TlHelp32.h> // second func.
#include <sstream> // for stringstream
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

using namespace std; // for deleted std::

//ConsolePX
class ConsolePX
{
public:
    wchar_t source;
    COLORREF foreground, background;
    /* Set at the start ctor */
    ConsolePX(wchar_t _what, COLORREF foregroundColor, COLORREF backgroundColor)
    {
        source = _what;
        foreground = foregroundColor;
        background = backgroundColor;
    }
    /* Draws wchar_t with colors to console */
    void Draw() {
        HANDLE outH = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_SCREEN_BUFFER_INFOEX curr, newBuff;
        curr.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
        GetConsoleScreenBufferInfoEx(outH, &curr);
        curr.srWindow.Bottom++;
        newBuff = curr;
        newBuff.ColorTable[0] = background;
        newBuff.ColorTable[1] = foreground;
        SetConsoleScreenBufferInfoEx(outH, &newBuff);
        SetConsoleTextAttribute(outH, 1);
        _setmode(_fileno(stdout), _O_U16TEXT);   //Sets console mode to 16-bit unicode
        std::wcout << source << std::endl;
        _setmode(_fileno(stdout), _O_TEXT);

        //Restores to defaults
        SetConsoleTextAttribute(outH, 7);
        SetConsoleScreenBufferInfoEx(outH, &curr);
    }
};

// r - RED, g - GREEN, b - BLUE, HexConvertor - rgb to hex.
string rgb2hex(int R, int G, int B, bool HexConvertor) {
    stringstream Hexconv;
    if (Hexconv)
        Hexconv << "#";
    Hexconv << hex << (R << 16 | G << 8 | B);
    return Hexconv.str();
}

int main() // Main Func
{
    int R, G, B;// R - RED, G - GREEN, B - BLUE
    printf("Please, Enter 3 (RGB) numbers to Console: \n");
    printf("RED - ");
    cin >> R;
    printf("GREEN - ");
    cin >> G;
    printf("BLUE - ");
    cin >> B;
    printf("-------------\n");
    printf("You writed 3 Numbers: \nR - %d\nG - %d\nB - %d", R, G, B);
    printf("\nHex Number: %s", rgb2hex(R, G, B, true).c_str()); // c_str() for job with strings!!!


    return 0;
}
Вот пример, только исходя из моего итогового Hex значения, справа рисовать цвет этого Hex значения
1662588244278.png
Команда для рисования цвета:
My Code2:
ConsolePX(L'█', RGB(18, 18, 18), RGB(0, 0, 0)).Draw();
 

Вложения

Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
Суть следующая, на фото есть синяя фигулина, квадратик, он должен быть такого цвета, который я вбиваю для конвертации rgb в hex, желательно что бы этот квадрат считывал hex значение, а не rgb, но если это слишком тяжело, то можно rgb, и уже исходя из него менял следующей строчкой цвет, на тот, который указан значением в hex, крайний случай это что бы он смотрел значения rgb и по ним менял цвет. Цвет квадрата устанавливается, благодаря классу ConsolePX
 
Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
Я исправил, сменив метод отрисовки, теперь все работает как нужно.
Программа полностью доделана, сменил на метод setPixel
 
Пользователь
Статус
Оффлайн
Регистрация
14 Дек 2018
Сообщения
194
Реакции[?]
30
Поинты[?]
1K
C++:
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <conio.h>
 
void main()
{
   // получаем идентификатор окна
   HWND hwnd = GetConsoleWindow();
 
   // получаем контекст отображения
   HDC hdc = GetDC(hwnd);
 
   RECT rt;
 
   char buf[100];
 
   // устанавливаем цвет фона
   SetBkColor(hdc, RGB(0, 0, 0));
 
   // устанавливаем цвет текста
   SetTextColor(hdc, RGB(255, 0, 0));
 
   // создаем красное перо
   HPEN hRedPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
 
   // и выбираем его в контекст отображения,
   // сохраняя предыдущее перо
 
   HPEN hOldPen = SelectPen(hdc, hRedPen);
 
   // создаем зеленую кисть
   HBRUSH hGreenBrush = CreateSolidBrush(RGB(0, 255, 0));
 
   // и выбираем ее в контекст отображения,
   // сохраняя предыдущую кисть
   HBRUSH hOldBrush = SelectBrush(hdc, hGreenBrush);
 
   // выводим строку стандартными средствами
   printf("Graphics in Console Window.");
 
   do {
 
       // получаем размер окна
       GetClientRect(hwnd, &rt);
 
       // формируем выводимую строку
       sprintf(buf, "Размер окна %d на %d пикселей", rt.right, rt.bottom);
 
       // выводим строку графическими средствами
       TextOutA(hdc, 10, 10, buf, strlen(buf));
 
       // рисуем закрашенный эллипс
       Ellipse(hdc, 10, 30, rt.right–10, rt.bottom–10);
 
   } while (getch() != 27); // при нажатии любой клавиши
 
   // (кроме Esc) перерисовываем изображение,
   // изображение изменится, если изменились размеры окна,
   // нажатие Esc – выход
   // выбираем в контекст отображения предыдущее перо
   SelectPen(hdc, hOldPen);
 
   // выбираем в контекст отображения предыдущую кисть
   SelectBrush(hdc, hOldBrush);
 
   // удаляем красное перо
   DeletePen(hRedPen);
 
   // удаляем зеленую кисть
   DeleteBrush(hGreenBrush);
 
   // освобождаем контекст отображения
   ReleaseDC(hwnd, hdc);
}
В консоль можно выводить не только текст, но и графику.
C++:
#include <windows.h>
#include <iostream>
 
int main()
{
    // Get window handle to console, and device context
    HWND console_handle = GetConsoleWindow();
    HDC device_context = GetDC(console_handle);
 
    //Here's a 5 pixels wide RED line [from initial 0,0] to 50,50
    HPEN pen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
    SelectObject(device_context, pen);
    LineTo(device_context, 50, 50);
 
    ReleaseDC(console_handle, device_context);
    std::cin.ignore();
    return 0;
}
DrawLine_ConsoleWinAPI.png
 
Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
C++:
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <conio.h>

void main()
{
   // получаем идентификатор окна
   HWND hwnd = GetConsoleWindow();

   // получаем контекст отображения
   HDC hdc = GetDC(hwnd);

   RECT rt;

   char buf[100];

   // устанавливаем цвет фона
   SetBkColor(hdc, RGB(0, 0, 0));

   // устанавливаем цвет текста
   SetTextColor(hdc, RGB(255, 0, 0));

   // создаем красное перо
   HPEN hRedPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));

   // и выбираем его в контекст отображения,
   // сохраняя предыдущее перо

   HPEN hOldPen = SelectPen(hdc, hRedPen);

   // создаем зеленую кисть
   HBRUSH hGreenBrush = CreateSolidBrush(RGB(0, 255, 0));

   // и выбираем ее в контекст отображения,
   // сохраняя предыдущую кисть
   HBRUSH hOldBrush = SelectBrush(hdc, hGreenBrush);

   // выводим строку стандартными средствами
   printf("Graphics in Console Window.");

   do {

       // получаем размер окна
       GetClientRect(hwnd, &rt);

       // формируем выводимую строку
       sprintf(buf, "Размер окна %d на %d пикселей", rt.right, rt.bottom);

       // выводим строку графическими средствами
       TextOutA(hdc, 10, 10, buf, strlen(buf));

       // рисуем закрашенный эллипс
       Ellipse(hdc, 10, 30, rt.right–10, rt.bottom–10);

   } while (getch() != 27); // при нажатии любой клавиши

   // (кроме Esc) перерисовываем изображение,
   // изображение изменится, если изменились размеры окна,
   // нажатие Esc – выход
   // выбираем в контекст отображения предыдущее перо
   SelectPen(hdc, hOldPen);

   // выбираем в контекст отображения предыдущую кисть
   SelectBrush(hdc, hOldBrush);

   // удаляем красное перо
   DeletePen(hRedPen);

   // удаляем зеленую кисть
   DeleteBrush(hGreenBrush);

   // освобождаем контекст отображения
   ReleaseDC(hwnd, hdc);
}
В консоль можно выводить не только текст, но и графику.
C++:
#include <windows.h>
#include <iostream>

int main()
{
    // Get window handle to console, and device context
    HWND console_handle = GetConsoleWindow();
    HDC device_context = GetDC(console_handle);

    //Here's a 5 pixels wide RED line [from initial 0,0] to 50,50
    HPEN pen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
    SelectObject(device_context, pen);
    LineTo(device_context, 50, 50);

    ReleaseDC(console_handle, device_context);
    std::cin.ignore();
    return 0;
}
Посмотреть вложение 220260
Как много кода, я сделал данную тему в 5 строчек кода от силы, сейчас скину код.

Code:
HWND consoleWindow = GetConsoleWindow();    // Get a console handle}

int main()
{
    HDC consoleDC = GetDC(consoleWindow);        // Get a handle to device context
while (true) {
        // Рисую Квадрат.
// Первая координата i - это X, это движение самой модельки влево или вправо, больше 350 вправо иначе влево.
// Вторая координата i это Длинна Квадрата, больше 500 это превращение в прямоугольник, иначе сужение.
        // if x > 500, Box
        for (int i = 350; i < 500; ++i)
        {// Координата j - это Y, больше 30, опускаем Квадрат вниз, иначе вверх.
            // Вторая часть этой координаты, больше 180 удлинняем квадрат по Y вниз, иначе Сужаем вверх.
            for (int j = 30; j < 180; ++j)
            {
                SetPixel(consoleDC, i, j, RGB(R, G, B));
            }
        }
    }
    ReleaseDC(consoleWindow, consoleDC);// Рисуем отдельное окно с квадратом.
    return 0;
}
C++:
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <conio.h>

void main()
{
   // получаем идентификатор окна
   HWND hwnd = GetConsoleWindow();

   // получаем контекст отображения
   HDC hdc = GetDC(hwnd);

   RECT rt;

   char buf[100];

   // устанавливаем цвет фона
   SetBkColor(hdc, RGB(0, 0, 0));

   // устанавливаем цвет текста
   SetTextColor(hdc, RGB(255, 0, 0));

   // создаем красное перо
   HPEN hRedPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));

   // и выбираем его в контекст отображения,
   // сохраняя предыдущее перо

   HPEN hOldPen = SelectPen(hdc, hRedPen);

   // создаем зеленую кисть
   HBRUSH hGreenBrush = CreateSolidBrush(RGB(0, 255, 0));

   // и выбираем ее в контекст отображения,
   // сохраняя предыдущую кисть
   HBRUSH hOldBrush = SelectBrush(hdc, hGreenBrush);

   // выводим строку стандартными средствами
   printf("Graphics in Console Window.");

   do {

       // получаем размер окна
       GetClientRect(hwnd, &rt);

       // формируем выводимую строку
       sprintf(buf, "Размер окна %d на %d пикселей", rt.right, rt.bottom);

       // выводим строку графическими средствами
       TextOutA(hdc, 10, 10, buf, strlen(buf));

       // рисуем закрашенный эллипс
       Ellipse(hdc, 10, 30, rt.right–10, rt.bottom–10);

   } while (getch() != 27); // при нажатии любой клавиши

   // (кроме Esc) перерисовываем изображение,
   // изображение изменится, если изменились размеры окна,
   // нажатие Esc – выход
   // выбираем в контекст отображения предыдущее перо
   SelectPen(hdc, hOldPen);

   // выбираем в контекст отображения предыдущую кисть
   SelectBrush(hdc, hOldBrush);

   // удаляем красное перо
   DeletePen(hRedPen);

   // удаляем зеленую кисть
   DeleteBrush(hGreenBrush);

   // освобождаем контекст отображения
   ReleaseDC(hwnd, hdc);
}
В консоль можно выводить не только текст, но и графику.
C++:
#include <windows.h>
#include <iostream>

int main()
{
    // Get window handle to console, and device context
    HWND console_handle = GetConsoleWindow();
    HDC device_context = GetDC(console_handle);

    //Here's a 5 pixels wide RED line [from initial 0,0] to 50,50
    HPEN pen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
    SelectObject(device_context, pen);
    LineTo(device_context, 50, 50);

    ReleaseDC(console_handle, device_context);
    std::cin.ignore();
    return 0;
}
Посмотреть вложение 220260
но большое спасибо, я думаю мне это пригодиться.
 
Пользователь
Статус
Оффлайн
Регистрация
14 Дек 2018
Сообщения
194
Реакции[?]
30
Поинты[?]
1K
Сверху Снизу