【问题标题】:Add Horizontal Scroll Bar to Console向控制台添加水平滚动条
【发布时间】:2018-10-20 05:40:57
【问题描述】:

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

有没有什么办法可以让程序写到同一行,加上水平滚动条让我可以看到全部?

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

#include <iostream>

using namespace std;


int main() {

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

        cout << "a";

    }

}

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

【问题讨论】:

  • 可能有一个控制台设置
  • 您使用的是 Linux、Windows 还是其他软件?
  • 这个问题是特定于操作系统的。你在说什么console
  • 我使用的是 Windows。我所说的控制台是你运行程序时出现的控制台(输出/打印所有内容的控制台)。

标签: c++ scroll console scrollbar


【解决方案1】:

此问题是特定于操作系统的,无法使用标准 C++ 解决。正如您在评论中所说,您使用的是 Windows,您需要查看 Microsoft 提供的文档。

这里是与控制台交互的函数列表:https://docs.microsoft.com/en-us/windows/console/console-functions

你感兴趣的是

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

如果您不知道控制台屏幕缓冲区是什么,微软在解释它方面做得比我做得更好,所以这里是:https://docs.microsoft.com/en-us/windows/console/console-screen-buffersenter link description here

对您来说重要的是,控制台屏幕缓冲区是一个二维数组。改变数组大小,你就改变了行的长度。

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

SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),coordinates) 被执行后,一切都在一条线上,并且有一个滚动条。但是有一个问题:这个解决方案只有在用户不调整控制台大小的情况下才有效。一旦用户调整窗口大小,一切都和以前一样。这个问题可能可以通过挖掘微软的文档来解决。还没有机会做。

#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 将重新格式化在重新占用缓冲区之前打印的任何内容。

【讨论】:

  • 我应该#include 做什么才能使用此功能?
  • 另外,你能发布一些使用这个函数的代码吗?我不熟悉与此有关的手柄和其他东西,所以举个例子会有所帮助。
  • 对不起,我没有写任何代码。我必须先写出来。我没有编辑我的答案。
  • 非常感谢!这个例子很完美,这解决了我的问题。我将此标记为正确答案。
  • 您可能想在代码中添加一些内容:事件监听。当控制台被重新占用时,您必须要求 Windows 通知您。如果没有这些知识,您不会没有何时重新申请缓冲区重新占用。 docs.microsoft.com/en-us/windows/console/console-winevents
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2016-10-20
    • 2011-07-28
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多