簡體   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