2012-05-01 24 views
3

CまたはC++でコンソール上の目的の場所にカーソルを設定するにはどうすればよいですか?テキストカーソルを特定の画面座標に移動しますか?

私はgotoxy(x,y)と呼ばれる機能を覚えていますが、その使用は推奨されていません。何か別の選択肢はありますか?

+2

これは標準CまたはC++の一部ではありません。 APIを使用する必要があります。どのようなカーソルを参照していますか?マウス?ターミナルのキーボードカーソル? – smocking

+0

キーボードカーソル。 – user1232138

+0

リニアテキスト出力以上のものを使いたい場合は、コンソールから完全に離れてください。開発者側でもユーザー側でも心配することはあまりにも多くの特権があります。 2Dグラフィックス([SFML](http://www.sfml-dev.org/)、[SDL](http://www.libsdl.org/))をサポートするライブラリを入手し、グラフィカルテキスト出力を使用してテキストを出力する機能。 –

答えて

2

SetConsoleCursorPositionを使用してください。

MSDNライブラリの同じ部分には他にも多くの機能があります。それらの中には便利なものもあります。

1

ncursesライブラリーについて話している場合は、後にある機能はmove (row, column)です。

-1

カーソルを設定するためにこれを考え出しました。

#include <iostream> 

void setPos(std::ostream& _os, const std::streamsize& _x, const std::streamsize& _y) 
{ 
    char tmp = _os.fill(); 

    if(_y>0) { 
      _os.fill('\n'); 
      _os.width(_y); 
      _os << '\n'; 
    } 
    if(_x>0) { 
      _os.fill(' '); 
      _os.width(_x); 
      _os << ' '; 
    } 
    _os.flush(); 
    _os.fill(tmp); 
} 

int main(int argc, char **argv) 
{ 
    setPos(std::cout, 5, 5); 
    std::cout << "foo" << std::endl; 
    return 0; 
} 

これ以上のことを行うには、解決策やライブラリの仮定が必要です(ncursesなど)。

+0

gotoxyとは異なり、関数はカーソルを前方にのみ移動できます。カーソルが(x、y)にある場合、setPos(a、b)の呼び出しは((y == 0?x:0)に移動し、 + a、y + b) - 新しいx座標はyに渡すパラメータに依存します。 – Algoman

+0

正確です。出力を所望のオフセットだけシフトする。実際には、出力を生成することによってこれを行います。私が正しくリコールすれば、テーブルのような出力フォーマットのためにこのようなものを使用しました。 – lupz

+0

'\ r'を印刷して前に進むと、任意の列に進むことができます。端末の幅を知っていれば、Y座標を制御することができます。なぜなら、出力はその間隔で自然に折り返されるからです。それがまったく動作するなら、 '\ r'または' \ n'で始まり、あなたが(0,0)で始まっていることを確認し、何も同時に印刷しないようにします。 –

3

CやC++には画面やコンソールの概念がありません。それらは、固有の表示特性を持たないバイトのストリームしか見ることができない。 ncursesのような多数のサードパーティ製APIがあります。

あなたは間に合わせのn-ソリューションをしたい場合は、使用している端末がANSI escape sequencesを理解し、その後、あなたが特定の行と列にカーソルを移動する

printf("\033[%d;%dH", row, col); 

のようなものを行うことができます(左上隅は{1,1}です)。あなたはncursesを使う方が良いでしょう(またはあなたのプラットフォームに相当するもの)。

1

私は本当に簡単な方法を使用します。コンソールアプリケーションを実際に使用している場合を除き、HANDLEが何であるかを知る必要はあまりありません.COORDオブジェクトはwindows.h標準ライブラリにあり、XとYの2つのメンバーデータintergersを持っています.0,0は左上ですコーナーとYが増加して画面を下ります。このコマンドを使用して、std :: cout < <を使い続けるだけで、必要なものを印刷することができます。

#include <windows.h> 

int main(void){ 
//initialize objects for cursor manipulation 
HANDLE hStdout; 
COORD destCoord; 
hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 

//position cursor at start of window 
destCoord.X = 0; 
destCoord.Y = 0; 
SetConsoleCursorPosition(hStdout, destCoord); 
} 
関連する問題