将水平滚动条添加到控制台

时间:2018-05-10 02:32:46

标签: c++ scroll console scrollbar

我正在用C ++编写一个程序,将一些文本输出到控制台。但是,这个文本通常很长,但我需要它在一行。程序只是转到下一行并写入那里,而不是继续在同一行上写入。

有没有办法让程序写入同一行,并添加一个水平滚动条,以便我可以看到它?

例如,以下代码在多行上输出字母a。

#include <iostream>

using namespace std;


int main() {

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

        cout << "a";

    }

}

有没有办法让所有“a”在同一条线上输出?显然这不适合控制台屏幕。那么,如何添加水平滚动条来查看全部内容呢?

2 个答案:

答案 0 :(得分:1)

此问题是特定于操作系统的,无法使用标准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 enter link description here

对您而言,重要的部分是控制台屏幕缓冲区是一个二维数组。更改数组大小,然后更改行的长度。

编辑0: 下面是我使用Visual Studio 2017和C ++在最新的Windows 10内部构建下编写的示例代码。

执行SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),coordinates)后,所有内容都在一行上,并且有一个滚动条。但是存在一个问题:此解决方案仅在用户未调整控制台大小时才有效。一旦用户调整窗口大小,一切都和以前一样。通过深入了解Microsoft的文档可能会解决这个问题。 Haven还没有机会这样做。

#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将重新格式化重新调整缓冲区之前已打印的内容。

答案 1 :(得分:0)

使用SetConsoleScreenBufferSizeSetConsoleScreenBufferInfoEx函数在写入之前更改控制台缓冲区的大小。