C++ CMD应用程序:命令滚动终端,直到当前线处于顶部?

问题描述 投票:0回答:2

I使用

cout
在我的C ++命令行应用程序中显示一些输出。现在,我发现自己希望通过编程方式滚动终端窗口,直到当前行一直处于顶部(并且以前的输出文本已隐藏在视图之外)。我怀疑有一个简单的命令可以做到这一点,但是我只是花了很多时间谷歌搜索,找不到它。

有一种方法可以迫使终端滚动到当前位置吗?如果是这样,我应该使用什么语法?

c++ windows visual-c++ command-line cout
2个回答
1
投票
撤出可以通过

AansiControl sequences

// System headers
#include <windows.h>

// Standard library C-style
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>

bool EnableVTMode()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return false;
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return false;
    }
    return true;
}

,然后激活ANSI序列,在

main
中,我们只需要致电一次:

bool fSuccess = EnableVTMode();

最终,由于我的终端总是保持在

30
高度线,以向上滚动端子,然后将当前的线放回顶部。

for (int i = 0; i < 30; i++) { cout << "\x0A"; } cout << "\x1b[H";
    

0
投票
即将发送” “终端的新线条。

多少?关于终端屏幕尺寸 - CurrentLineOffSety。现在,您需要获取屏幕尺寸。有ESC代码可以做到这一点。每个终端都可以自行设置。 “ “是C0,控制代码,ESC代码为C1或控制“函数”,我认为1是因为一个字节是ESC 0x1b,然后进行序列,例如

\n

-新线路或线供稿0x10

<ESC>E

 -nel,下一行,效果与 
,0x1b e
<ESC>D
-ind,索引,愚蠢的名称,在底线上移动光标自己并滚动文本
这些没有光标的骗局
<ESC>[<X>S
-su,滚动线(锅向下)

<ESC>[<X>T

-SD,向下滚动(pan向上)

表示文字上升,向下 - 向下。 SU工作正常,但是SD并没有真正从我的终端上的滚动缓冲区中拿出线条。我建议尝试一些准备使用TUI组件和高级语言。
    
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.