Как написать UNICODE или расширенный ASCII с WriteConsoleOutput - PullRequest
0 голосов
/ 08 апреля 2020

При использовании только символов ASCII все символы и заданные значения цвета отображаются корректно, однако, всякий раз, когда я использую символы Extended ASCII или UNICODE, я получаю это сообщение об ошибке (и мой компилятор g ++ указывает, что проблема не в символе ASCII):

warning: multi-character character constant [-Wmultichar]
error: narrowing conversion of '14849683' from 'int' to 'WCHAR' {aka 'wchar_t'} inside { } [-Wnarrowing]

Я использую параметр -lgdi32 в моей команде компиляции.

Я использую WriteConsoleOutputA или WriteConsoleOutputW, по-видимому, не имеет никакого значения.

Я считаю, что ширина символа массива CHAR_INFO по умолчанию равна 8 битам, поэтому я думаю, что это следует изменить, но я ничего не могу найти в документации по Windows Console API.

Итак, чтобы быть понятным, все # символы отображаются правильно, но если я использую такие символы, как: ░ или ┐, я получаю сообщение об ошибке выше.

CHAR_INFO map[400] = {
            '#', 0x002C, '#', 0x002C, '#', 0x002C, '#', 0x002C, '#', 0x002C,'#', 0x002C, '#', 0x002C, '#', 0x002C, '#', 0x002C, '#', 0x002C,
            '#', 0x002C, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', 0x002C,
            '#', 0x002C, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', 0x002C,
            '#', 0x002C, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', 0x002C,
            '#', 0x002C, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', 0x002C,
            '#', 0x002C, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', 0x002C,
            '#', 0x002C, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', 0x002C,
            '#', 0x002C, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', 0x002C,
            '#', 0x002C, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', 0x002C,
            '#', 0x002C, '#', 0x002C, '#', 0x002C, '#', 0x002C, '#', 0x002C,'#', 0x002C, '#', 0x002C, '#', 0x002C, '#', 0x002C, '#', 0x002C
        };


        COORD coordinateBufferSize;
        coordinateBufferSize.Y = 10;
        coordinateBufferSize.X = 10;

        COORD topLeftCoordinate;
        topLeftCoordinate.Y = 0;
        topLeftCoordinate.X = 0;

        PSMALL_RECT srcWriteRect;
        srcWriteRect->Top = 10;         // Number of rows to the top
        srcWriteRect->Left = 10;        // Numbers of columns to the side
        srcWriteRect->Bottom = 19;
        srcWriteRect->Right = 19;


        HANDLE oldScreenBuffer, newScreenBuffer;


        oldScreenBuffer = GetStdHandle(STD_OUTPUT_HANDLE);
        newScreenBuffer = CreateConsoleScreenBuffer(
            GENERIC_READ | GENERIC_WRITE,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            NULL,
            CONSOLE_TEXTMODE_BUFFER,
            NULL);

        BOOL succes = WriteConsoleOutputA(
            newScreenBuffer,                    // The new ScreenBuffer
            map,                                // The char array we want to display
            coordinateBufferSize,               // 
            topLeftCoordinate,
            srcWriteRect
        );

        SetConsoleActiveScreenBuffer(newScreenBuffer);

1 Ответ

0 голосов
/ 08 апреля 2020

Вы должны использовать WriteConsoleOutputW. Тип CHAR_INFO - это структура атрибута (цвет в вашем случае) и объединение символов и широких символов, поэтому здесь нет проблем.

Некоторые консольные шрифты не поддерживают много символов, проверьте, поддерживает ли ваш шрифт по умолчанию символы, которые вы хотите напечатать.

...