スクリーンバッファスクリーンバッファとは、実際の文字が書き込まれているバッファのことです。コンソールが作成された段階では既定で1つのスクリーンバッファが作成されています。独自のスクリーンバッファを作成してそこに出力を行うこともできるようになっています。スクリーンバッファを作成するには、CreateConsoleScreenBufferを呼び出します。lpScreenBufferData);dwDesiredAccessは、スクリーンバッファへのアクセス権を指定します。通常は、GENERIC_READとGENERIC_WRITEを指定します。dwShareModeは、スクリーンバッファを共有するための定数を指定します。共有しない場合は0を指定します。lpSecurityAttributesは、SECURITY_ATTRIBUTES構造体のアドレスを指定します。通常は、NULLを指定します。dwFlagsは、CONSOLE_TEXTMODE_BUFFERを指定します。lpScreenBufferDataは、NULLを指定します。戻り値であるスクリーンバッファのハンドルはCloseHandleで閉じることになります。作成したスクリーンバッファは、SetConsoleActiveScreenBufferでアクティブにすることができます。アクティブにしたスクリーンバッファの内容は、実際にコンソールに表示されるようになります。hConsoleOutput);hConsoleOutputは、スクリーンバッファのハンドルを指定します。今回のプログラムは、既定のスクリーンバッファに簡単なメニューを表示します。aまたはbという文字を入力すると、既定のバッファが自作のバッファに切り替わってメニューの内容が表示されます。TEXT("メニューを選択してください。0;}このプログラムでは、スクリーンバッファを2つ作成しています。1つはコンピュータ名が書き込まれたバッファBです。取得した文字列がbである場合はバッファBに切り替わります。バッファを切り替える際には、SetConsoleTitleを呼び出して現在のバッファの名前をコンソールのタイトルに表示します。この文字列の終端がNULL文字になっていないためです。改行コードであるCRとLFを考慮しないために、インデックスを2つ戻します。切り替わったバッファから既定のバッファに戻すには、Enterキーを入力します。これによりReadConsoleが制御を返し、hStdOutputを引数としたSetConsoleActiveScreenBufferが呼ばれることになります。入力した文字は現在アクティブであるバッファには表示されません(ただし第2引数には格納されます)。これを表すhStdInputを必ず指定しなければなりません。入力された文字は既定のバッファからでしか確認できません。ウインドウのサイズとスクリーンバッファのサイズの両方を調整することになります。1つの決まりとして、スクリーンバッファのサイズはウインドウのサイズより小さくてはいけません。バッファのサイズが小さければ、ウインドウに何も表示されない領域ができてしまうからです。よって、バッファのサイズはウインドウのサイズよりも1つ以上大きくなければなりません。次に重要なのは、サイズは文字数単位で指定するという点です。コンソールの横方向に100個の文字を表示したいのであれば、幅の値は100となります。以上の点に注意しながら、次のコードを確認します。&rc);rcはウインドウのサイズを格納し、coordはバッファのサイズを格納することになります。幅と高さを表すメンバに+1をして代入しています。次にSetConsoleWindowInfoでウインドウのサイズを設定します。これらは順序逆になってはいけません。ウインドウにはスクロールバーが表示されません。理由は、バッファが完全にウインドウ内に入りきっているからです。スクロールバーが表示されることになります。2のようにすると、垂直方向に1回スクロールできるようになります。