コンソールの画面バッファー

画面バッファーは、コンソール ウィンドウに出力するための文字および色のデータの 2 次元配列です。 コンソールには複数の画面バッファーを持たせることができます。 アクティブ画面バッファーは、画面に表示されるものです。

新しいコンソールを作成するたびに、システムにより画面バッファーが作成されます。 コンソールのアクティブな画面バッファーへのハンドルを開くには、CreateFile 関数の呼び出しで CONOUT$ 値を指定します。 プロセスにより、CreateConsoleScreenBuffer 関数を使用して、コンソール用に追加の画面バッファーを作成できます。 新しい画面バッファーは、SetConsoleActiveScreenBuffer 関数の呼び出しでそのハンドルが指定されるまで、アクティブになりません。 ただし、アクティブか非アクティブかに関係なく、画面バッファーには読み取りと書き込みのためにアクセスできます。

各画面バッファーには、文字情報レコードの独自の 2 次元配列があります。 各文字のデータは、Unicode または ANSI 文字と、その文字が表示される前景色と背景色を指定する CHAR_INFO 構造体に格納されます。

画面バッファーに関連付けられている多くのプロパティは、画面バッファーごとに個別に設定できます。 これは、アクティブな画面バッファーを変更すると、コンソール ウィンドウの外観に大きな影響を与える可能性があることを意味します。 画面バッファーに関連付けられているプロパティは次のとおりです。

  • 画面バッファー サイズ (文字の行数と列数)。
  • テキスト属性 (WriteFile または WriteConsole 関数によって書き込まれるテキストを表示するための前景色と背景色)。
  • ウィンドウのサイズと場所 (コンソール ウィンドウに表示されるコンソール画面バッファーの四角形の領域)。
  • カーソルの位置、外観、および可視性。
  • 出力モード (ENABLE_PROCESSED_OUTPUT および ENABLE_WRAP_AT_EOL_OUTPUT)。 コンソール出力モードの詳細については、「高レベル コンソール モード」を参照してください。

画面バッファーが作成されると、すべての位置にスペース文字が含まれます。 そのカーソルは表示され、バッファーの原点 (0,0) に配置され、ウィンドウは左上隅がバッファーの原点に配置されます。 コンソール画面バッファーのサイズ、ウィンドウ サイズ、テキスト属性、およびカーソルの外観は、ユーザーまたはシステムの既定値によって決定されます。 コンソール画面バッファーに関連付けられているさまざまなプロパティの現在の値を取得するには、GetConsoleScreenBufferInfoGetConsoleCursorInfo、および GetConsoleMode の各関数を使用します。

コンソール画面バッファーのいずれかのプロパティを変更するアプリケーションの場合、独自の画面バッファーを作成するか、起動時に継承された画面バッファーの状態を保存し、終了時に復元することをお勧めします。 この協調動作は、同じコンソール セッションを共有する他のアプリケーションが変更の影響を受けないようにするために必要です。

ヒント

可能であれば、この目的のために 2 つ目の画面バッファーを作成するのではなく、今後は代替バッファー モードを使用することをお勧めします。 代替バッファー モードを使用すると、リモート デバイス間および他のプラットフォームとの互換性が向上します。 詳細については、クラシック コンソール API と仮想ターミナルに関する記事を参照してください。

カーソルの外観と位置

画面バッファーのカーソルは表示または非表示にすることができます。 表示される場合、その外観は、文字セルを完全に塗りつぶすものから、セルの下部に水平線として表示されるものまでさまざまです。 カーソルの外観と可視性に関する情報を取得するには、GetConsoleCursorInfo 関数を使用します。 この関数を使用すると、カーソルが表示されているかどうかが報告され、カーソルの外観が、塗りつぶされた文字セルの割合として記述されます。 カーソルの外観と可視性を設定するには、SetConsoleCursorInfo 関数を使用します。

高レベル コンソール I/O 関数によって書き込まれた文字は、現在のカーソル位置に書き込まれ、カーソルは次の位置に移動されます。 画面バッファーの座標系での現在のカーソル位置を確認するには、GetConsoleScreenBufferInfo を使用します。 SetConsoleCursorPosition を使用してカーソル位置を設定し、それによって、高レベル I/O 関数によって書き込まれる、またはエコーされるテキストの配置を制御できます。 カーソルを移動すると、新しいカーソル位置のテキストが上書きされます。

Note

低レベルの関数を使用してカーソル位置を見つけることはお勧めしません。 高度なレイアウトで必要な場合は、仮想ターミナル シーケンスを使用してこの位置を照会することをお勧めします。 仮想ターミナル シーケンスの優先度の詳細については、従来の関数と仮想ターミナルのドキュメントを参照してください。

カーソルの位置、外観、および可視性は、画面バッファーごとに個別に設定されます。

文字属性

文字属性は、色と DBCS の 2 つのクラスに分類できます。 次の属性は、WinCon.h ヘッダー ファイルで定義されています。

属性 意味
FOREGROUND_BLUE テキストの色は青で表示されます。
FOREGROUND_GREEN テキストの色は緑で表示されます。
FOREGROUND_RED テキストの色は赤で表示されます。
FOREGROUND_INTENSITY テキストの色は強調表示されます。
BACKGROUND_BLUE 背景色は青で表示されます。
BACKGROUND_GREEN 背景色は緑で表示されます。
BACKGROUND_RED 背景色は赤で表示されます。
BACKGROUND_INTENSITY 背景色は強調表示されます。
COMMON_LVB_LEADING_BYTE 先頭のバイト。
COMMON_LVB_TRAILING_BYTE 末尾のバイト。
COMMON_LVB_GRID_HORIZONTAL 上に横線。
COMMON_LVB_GRID_LVERTICAL 左に縦線。
COMMON_LVB_GRID_RVERTICAL 右に縦線。
COMMON_LVB_REVERSE_VIDEO 前景と背景の属性を反転します。
COMMON_LVB_UNDERSCORE アンダースコア。

前景の属性では、テキストの色を指定します。 背景の属性では、セルの背景の塗りつぶしに使用する色を指定します。 その他の属性は DBCS と共に使用されます。

アプリケーションにより、前景と背景の定数を組み合わせて、さまざまな色を実現できます。 たとえば、次の組み合わせにすると、青色の背景に明るいシアンのテキストが表示されます。

FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE

背景の定数が指定されていない場合、背景は黒です。また、前景の定数が指定されていない場合、テキストは黒です。 たとえば、次の組み合わせにすると、白い背景に黒いテキストが生成されます。 赤、緑、青が背景に指定され、組み合わさって白い背景になります。 フラグの色が前景に指定されていないため、これは黒になります。

BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED

各画面バッファーの文字セルには、そのセルの前景 (テキスト) と背景の描画に使用される色の色属性が格納されます。 アプリケーションにより、各文字セルの色データを個別に設定し、各セルの CHAR_INFO 構造体の Attributes メンバーにデータを格納することができます。 各画面バッファーの現在のテキスト属性は、高レベルの関数によって後で書き込まれる、またはエコーされる文字に使用されます。

アプリケーションにより、GetConsoleScreenBufferInfo を使用して画面バッファーの現在のテキスト属性を判別し、SetConsoleTextAttribute 関数を使用して文字属性を設定することができます。 画面バッファーの属性を変更しても、以前に書き込まれた文字の表示には影響しません。 これらのテキスト属性は、低レベルのコンソール I/O 関数 (WriteConsoleOutputWriteConsoleOutputCharacter 関数など) によって書き込まれる文字には影響しません。これらはいずれも、書き込まれる各セルの属性を明示的に指定し、そうでなければ属性は変更されないものです。

Note

低レベルの関数を使用して既定および特定のテキスト属性を操作することはお勧めしません。 テキスト属性を設定するには、仮想ターミナル シーケンスを使用することをお勧めします。 仮想ターミナル シーケンスの優先度の詳細については、従来の関数と仮想ターミナルのドキュメントを参照してください。

フォント属性

GetCurrentConsoleFont 関数を使用して、現在のコンソール フォントに関する情報を取得します。 CONSOLE_FONT_INFO 構造体に格納される情報には、フォントの各文字の幅と高さが含まれます。

GetConsoleFontSize 関数を使用して、指定されたコンソール画面バッファーに使用されているフォントのサイズを取得します。

Note

関数を使用してフォント情報を検出して操作することはお勧めしません。 フォントに中立的な方法でコマンドライン アプリケーションを操作し、クロスプラットフォームの互換性と、ユーザーがフォントをカスタマイズできるホスト環境との互換性を確保することをお勧めします。 ユーザー設定とターミナルを含むホスト環境の詳細については、エコシステムのロードマップに関する記事を参照してください。