2011-07-25 12 views
13

コンソールウィンドウでymaxとxmaxを確認するには、Windowsではplain cを使用しますか?ウィンドウのcで端末のサイズを取得していますか?

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); 
} 

は、今私は、私は窓のために同じことを行うことができますどのように疑問に思います。私はwinioctl.hを試しましたが、それはstruct winsizeも同様の名前の他のものを定義していません。

ヒント?ありがとう。

PS。 linuxでは、getenv("LINES");を使ってコンソールサイズを見つけることもできます。同様の変数がウィンドウの下にありますか?

PPS。また、常にncurses.hがあります。両方のシステムで動作すると思いますが、他のライブラリとの競合のために回避しています。

PPPS。ここのこの質問Getting terminal width in C?にはヒントがたくさんあるので、それを繰り返す必要はありません。

答えて

3

(部分的な答え)

このコード:

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); 
} 

は、バッファのサイズを与えます。唯一の問題は、dwSize.Yが本当に画面のサイズ(ここでは25行の代わりに300)ではないということです。しかし、dwSize.Xは列の番号と一致します。機能するにはwindows.hのみ必要です。

21

これは、コンソールのサイズではなく、バッファ印刷:srWindow「は表示画面の左上と右下の角のコンソールスクリーンバッファの座標が含まれている」ので、このコードが動作

#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; 
} 

をMSDNによれば、SMALL_RECT構造体は "画面バッファ文字セルの行と列を指定する"私はコンソールウィンドウのサイズを得るために平行な側面を引いた。私は1を実際の値よりも小さくしていたので、私はそれを追加しました。

+0

私は時間がかかりますが、これは質問に対する正しい答えのようです。この回答と現在受け入れられているバッファサイズの違いを教えてください。ありがとう! –

+0

@DrBecoほとんどの場合、答えのバッファーサイズとこの答えに記載されている表示ウィンドウの幅は同じですが、これは必須ではありません。しかし、バッファーに注意すると、ウィンドウはさまざまな高さを持つことができます。これは、Windowsコンソールセッションをスクロールバックする機能を提供します。メインバッファの任意の部分を見ることができる、より小さなビューポート(表示)ウィンドウで、大きなバッファの観点から考えるのが最も簡単です。 – dgnuff

関連する問題