今日はものすごく眠かった。
まぁなにかと疲れていたのだろう。
以前VT-100のエスケープシーケンスでいろいろやっていたことがあったのだが、
ふと使いたくなってWindowsで試していた。ところがうまくいかない。
以前はLinuxでやっていたのだが、Windows 2000,Windows XPでも使えるはずなんだけどな。
実はどうもANSI.SYSを標準で読み込んでいないかららしい。
まぁそういう事情は知らなかったので、一体どうすれば実現できるのかなとうんうんうなっていたが、
どうもWin32APIにそういう関数があったので、これを利用してやってみた。
そういうお話。
調べるとカーソル移動はSetConsoleCursorPosition関数というのを使えばいいらしい。
#include
#include
#include
int main(void){
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO info;
GetConsoleScreenBufferInfo(out,&info);
std::cout << info.srWindow.Right << std::endl;
for(double t=0;t<=3.141592*2;t+=0.1){
COORD pos;
pos.X=info.srWindow.Right-(1.0+std::cos(t))*20;
pos.Y=info.srWindow.Top+(1.0+std::sin(t))*10;
SetConsoleCursorPosition(out,pos);
std::cout << "*";
}
SetConsoleCursorPosition(out,info.dwCursorPosition);
return 0;
}
基本的にはC++のプログラムなのですが、Win32APIはCなので所々Cっぽいですね。
やたら構造体が多いので複雑なんですわ。
COORD構造体にxy座標をセットしてSetConsoleCursorPositionでセットするだけですね。
ただ、そのためには画面の大きさの情報がいるので、これはGetConsoleScreenBufferInfoで得ている。
最後はここにそれを呼び出したときのカーソル位置が入っているので戻しているわけです。
これでなにができるかというとCUIのプログラムのデバッグ時にコンソールの右上にデバッグ情報を表示できると。
これでXをinfo.srWindow.Right-10、Yをpos.Y=info.srWindow.Topなんかにセットして表示すれば楽しそうですね。
こういうことをしたかったわけです。
他にもいろいろできそうですね。
まぁ問題はWin32の流儀がようわからんのでMSDNもよう読まんことだが。