繁体   English   中英

获取Win32控制台中输出的行数?

[英]Get the amount of lines outputted in a Win32 console?

我正在尝试使用一些业余C编程来创建自己的函数来清除控制台输出列。 我想在调用函数时获取控制台输出中的行数,以便我可以将光标移动到每行中的指定列,将该列上的空格重写为空格,然后转到下一行。 不幸的是,当它到达最后一行时我无法结束循环。

我应该如何获得当前控制台输出中的行数?

初始化事物需要几个步骤,但提供您正在寻找的信息的调用是GetConsoleScreenBufferInfo

至少,您需要一个指向控制台的句柄 (文件描述符)。 您可以使用GetStdHandle执行此操作 ,例如,

HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);

假设你#include <Windows.h>你可以这样做:

HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO screen;

GetConsoleScreenBufferInfo(console, &screen);

然后访问尺寸就像输入screen.dwSize.X (width)和screen.dwSize.Y (height)一样简单,但是这会产生一个问题, XY尺寸的大小不是缓冲区的大小被显示。

所以在我的电脑上,如果我这样做:

printf("X:%d - Y:%d\n", screen.dwSize.X, screen.dwSize.Y);

它显示X:80 - Y:1000当可见Y尺寸仅为25但我可以滚动1000的长度。

如何获得当前可见的输出大小我不确定,但这是一个清除整个屏幕缓冲区的函数:

void clearScreen(void) {
    COORD topLeft  = { 0, 0 };
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO screen;
    DWORD written;

    GetConsoleScreenBufferInfo(console, &screen);
    FillConsoleOutputCharacterA(
        console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    FillConsoleOutputAttribute(
        console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
        screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    SetConsoleCursorPosition(console, topLeft);
}

一个简单的gotoxy函数用于光标控制:

void gotoxy(int x, int y){
    COORD cursorPos = {x,y};
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(console, cursorPos);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM