Добавить горизонтальную полосу прокрутки к консоли - PullRequest
0 голосов
/ 10 мая 2018

Я пишу программу на C ++, которая выводит некоторый текст на консоль. Тем не менее, этот текст часто длинный, но мне нужно в одной строке. Вместо того, чтобы продолжать писать в той же строке, программа просто переходит на следующую строку и записывает туда.

Есть ли способ заставить программу писать в одну строку и добавить горизонтальную полосу прокрутки, чтобы я мог видеть все это?

Например, следующий код выводит букву a в несколько строк.

#include <iostream>

using namespace std;


int main() {

    for (int n = 0; n < 1000; n++) {

        cout << "a";

    }

}

Есть ли способ сделать так, чтобы все "а" выводились в одной строке? Очевидно, что это не поместится на экране консоли. Итак, как я могу добавить горизонтальную полосу прокрутки, чтобы увидеть все это?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Этот вопрос относится к конкретной операционной системе и не может быть решен с помощью стандарта C ++. Как вы указали в комментарии, что используете Windows, вам нужно взглянуть на документацию, предоставленную Microsoft.

Вот список функций для взаимодействия с консолью: https://docs.microsoft.com/en-us/windows/console/console-functions

То, что вас интересует, это

BOOL WINAPI SetConsoleScreenBufferSize(
  _In_ HANDLE hConsoleOutput,
  _In_ COORD  dwSize
);

Если вы не знаете, что такое экранный буфер консоли, Micrososft лучше объясняет его, чем я, поэтому вот оно: https://docs.microsoft.com/en-us/windows/console/console-screen-buffers введите описание ссылки здесь

Важной частью для вас является то, что экранный буфер консоли является двумерным массивом. Измените размер массива, и вы измените длину строки.

РЕДАКТИРОВАТЬ 0: Вот пример кода, который я только что написал в последней инсайдерской сборке Windows 10 с использованием Visual Studio 2017 и C ++.

После выполнения SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),coordinates) все находится в одной строке и имеется полоса прокрутки. Но есть проблема: это решение работает, только если пользователь не изменяет размер консоли. Как только пользователь изменяет размер окна, все остается прежним. Вероятно, проблему можно решить, покопавшись в документации Microsoft. У меня еще не было возможности сделать это.

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

using namespace std;

int main()
{
    for (short int i = 0; i < 1000; i++)
    {
        cout << "a";
    }

    cout << endl;

    _COORD coordinates;
    coordinates.X = 1000;
    coordinates.Y = 1000;

    if (0 == SetConsoleScreenBufferSize(
        GetStdHandle(STD_OUTPUT_HANDLE),
        coordinates
    ))
    {
        return -1;
    }

    for (short int i = 0; i < 1000; i++)
    {
        cout << "b";
    }

    cout << endl;

    return 0;
}

Следующий код не требуется строго:

for (short int i = 0; i < 1000; i++)
    {
        cout << "b";
    }

Windows переформатирует все, что было напечатано, до повторного изменения размера буфера.

0 голосов
/ 10 мая 2018

Используйте функции SetConsoleScreenBufferSize или SetConsoleScreenBufferInfoEx, чтобы изменить размер буфера консоли перед записью в него.

...