サードパーティのライブラリを使用せずに、Windows ネイティブ C++ コンソール アプリのコンソールの同じ部分を上書きするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/45286

  •  09-06-2019
  •  | 
  •  

質問

アイテムの状態を表示する必要があるコンソール アプリがありますが、テキストが狂ったようにスクロールするよりも、現在のステータスが同じ行に表示され続けるのを確認したいと考えています。例として:

Running... nn% complete
Buffer size: bbbb bytes

が出力になります。「nn」は現在の完了率、「bbbb」はバッファ サイズで、コンソールの同じ行で定期的に更新されます。

私が採用した最初のアプローチは、新しい状態を出力する前に正しい数のバックスペースをコンソールに出力するだけでしたが、これには不快なちらつきがあるため、取り除きたいと考えています。また、この 1 つの単純なニーズに対して別の依存関係を導入しないように、標準ライブラリまたは MS が提供する機能 (VC 8) のいずれかにこだわりたいと考えています。

役に立ちましたか?

解決

使用できます SetConsoleCursorPosition. 。電話する必要があります GetStdHandle 出力バッファへのハンドルを取得します。

他のヒント

Joseph、JP、CodingTheWheel は全員、貴重な支援を提供してくれました。

私の単純なケースでは、最も単純なアプローチは次のようなものに基づいているようです。 codingTheWheelさんの答え:

// before entering update loop
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(h, &bufferInfo);

// update loop
while (updating)
{
  // reset the cursor position to where it was each time
  SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition);

  //...
  // insert combinations of sprintf, printf, etc. here
  //...
}

より複雑な問題の場合は、完全な コンソールAPI によって提供される JPさんの答えは, を通じて提供される例と連携して、 リンク から ジョセフの答え 便利かもしれませんが、使用するには作業が必要であることがわかりました CHAR_INFO このような単純なアプリには面倒すぎます。

を使用して印刷し、改行を生成したり、末尾に を追加したりする関数を使用しない場合、カーソルは行の先頭に戻り、次に入力した内容を上書きして印刷します。印刷前に完全な文字列を生成すると、ちらつきも軽減される可能性があります。

アップデート:質問の出力が 1 行ではなく 2 行に変更されたため、私の回答は完全ではなくなりました。より複雑なアプローチが必要になる可能性があります。JP は正しい考えを持っています コンソールAPI. 。次のサイトには、目標を達成するために必要なことの多くが詳しく記載されていると思います。このサイトでは、ちらつきを減らす鍵は、表示する前にすべてを画面外にレンダリングすることであるとも述べています。これは、テキストであろうとグラフィックス (2D または 3D) であろうと、画面上に何かを表示する場合には常に当てはまります。

http://www.benryves.com/tutorials/?t=winconsole

Joseph の提案では十分な柔軟性が得られない場合は、コンソール API を見てください。 http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx.

Linux では、\b および/または を stderr に出力することでこれを実現できます。Windows での適切な組み合わせを見つけるには、実験が必要な場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top