2011-07-25 13 views
13

Jak sprawdzić jeax i xmax w oknie konsoli, pod Windows, używając zwykłego c?Uzyskiwanie rozmiaru terminala wc dla systemu Windows?

Jest to kawałek kodu dla Linux:

#include <stdio.h> 
#include <sys/ioctl.h> 
int main (void) 
{ 
    struct winsize max; 
    ioctl(0, TIOCGWINSZ , &max); 
    printf ("lines %d\n", max.ws_row); 
    printf ("columns %d\n", max.ws_col); 
} 

Teraz zastanawiam się, jak mogę zrobić to samo dla okien. Próbowałem winioctl.h, ale nie definiuje ona struct winsize ani żadnego innego o podobnej nazwie.

Jakieś wskazówki? Dzięki.

PS. W systemie Linux można również znaleźć rozmiar konsoli za pomocą getenv("LINES");. Czy jest podobna zmienna pod oknami?

PPS. Poza tym zawsze jest ncurses.h, co przypuszczam, że działa oba systemy, ale unikam go z powodu konfliktów z innymi bibliotekami, które mam.

PPPS. To pytanie tutaj Getting terminal width in C? ma wiele wskazówek, więc nie trzeba tego powtarzać.

Odpowiedz

3

(odpowiedź częściowa)

Kod:

CONSOLE_SCREEN_BUFFER_INFO csbi; 
int ret; 
ret = GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&csbi); 
if(ret) 
{ 
    printf("Console Buffer Width: %d\n", csbi.dwSize.X); 
    printf("Console Buffer Height: %d\n", csbi.dwSize.Y); 
} 

podaje rozmiar bufora. Jedynym problemem jest to, że dwSize.Y nie jest tak naprawdę rozmiarem ekranu (tutaj 300 zamiast 25 linii). Ale dwSize.X dopasowuje numer kolumny. Potrzebujesz tylko windows.h do pracy.

21

Drukuje rozmiar konsoli, a nie bufor:

#include <windows.h> 

int main(int argc, char *argv[]) { 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    int columns, rows; 

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); 
    columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; 
    rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; 

    printf("columns: %d\n", columns); 
    printf("rows: %d\n", rows); 
    return 0; 
} 

Ten kod działa, ponieważ srWindow „zawiera współrzędne buforowe ekran konsoli lewym górnym i dolnym prawym rogu okna wyświetlacza” , a struktura "określa wiersze i kolumny komórek znakowych bufora ekranu" zgodnie z MSDN. Odjęłem równoległe boki, aby uzyskać rozmiar okna konsoli. Ponieważ otrzymałem 1 mniej niż rzeczywistą wartość, dodałem jeden.

+0

Mam mało czasu, aby go przetestować, ale wygląda na to, że jest to właściwa odpowiedź na to pytanie. Czy mógłbyś wskazać różnicę między tą odpowiedzią a aktualnie akceptowaną, która pokazuje rozmiar bufora? Dzięki! –

+0

@DrBeco W większości przypadków rozmiar bufora z odpowiedzi oraz okno wyświetlania wymienione w tej odpowiedzi mają tę samą szerokość, chociaż nie jest to wymagane. Jednak, jak zauważyłeś, bufor i okna mogą i często mają różne wysokości - to właśnie zapewnia możliwość przewijania kopii zapasowej sesji konsoli Windows. Uważam, że najłatwiej jest myśleć w kategoriach dużego bufora, z mniejszym oknem podglądu (wyświetlania), które może wyglądać w dowolnej sekcji głównego bufora. – dgnuff

Powiązane problemy