第27章 画面消去など 


今回は、前回に引き続きエスケープ・シーケンスをやります。これを 画面に出力することによりいろいろなことができます。 画面に出力するには、printfとか、putsその他を使います。 これらのエスケープ・シーケンスを受けたときMS-DOSが処理してくれるので コンピュータの機種に関係なく動作します。(もしかすると、機種によっては 動作しないものがあるかもしれません。もしあったら、機種名どのシーケンス が働かないかメールで教えてください。)

それでは、本題に入ります。

今回は、画面のいろいろな消去法、カーソルの消去等々をやります。 制御コードと動作を表にしますので各自で試してください。

制御コード動作
ESC [0Jカーソル位置から、画面の最後までを消す
ESC [1J画面の最初の位置から、カーソルまで消す
ESC [2J全部消す
ESC [0Kカーソルからその行の終わりまでを消す
ESC [1Kその行の最初からカーソルまでを消す
ESC [2Kカーソルのある行を消す

制御コード動作
ESC [>1l一番下の行にファンクションキー表示
ESC [>1h一番下の行もアプリで使う!!
ESC [>3l25行モード
ESC [>3h20行モード
ESC [>5lカーソル表示
ESC [>5hカーソル非表示

はい。今回はこれでおしまい・・・と、思いましたがあまりに短いので おまけとして、これらのエスケープシーケンスのうまい?利用法 について考えてみます。と、言ってもたいていのことは、入門書に 書いてあります。ここでは、少しひねくれた使い方も考えてみましょう。

まず、いちいちprintf("\x1b何タラ、カンタラ");などと書くのは 面倒くさいですね。これをもう少し楽をして実現する方法を 考えてみましょう。

(1)#defineを使ってもっと簡単なコマンド風にする

(2)関数を作っちゃう。

(3)上の2つの組み合わせ

などか考えられます。

あ、いかん!

第18章で「このdefineというのは、あとの章で解説しますが ・・・」などと書いているがその後全然defineについて解説 せずに今日まで来てしまいました。ま、賢明な読者諸君にとっては 改めて説明するまでもないけど

#define マクロ名(引数,・・・) (文字列)

というように使います。引数がなければ文字列のカッコは不要です。 たとえば、

#define PAI 3.14

なんてのは、よく入門書に出ていますね。円周率を頻繁に使うプログラムでは 円周率の所にいちいち3.14....何て書くのはだるいし、まちがいのもとです。 これで、(1)については、わかりましたね。 プログラムの最初に、

#define CLS printf("\x1b[2J")

と書いておけば、プログラム中でCLS;とすれば画面が 消去されます。

#defineは単に、文字の置き換えをするだけです。 ですから、

#define CLS printf("...");

とするとmain関数中でCLS(セミコロンなし)と書くだけで

printf("....");

が実行されます。 あんまり、調子に乗ってdefineを多用するとかえってわかりにくく なるのでほどほどに使いましょう。(中庸の徳?)

さて、次は関数にしてしまいましょう。たとえば printf()の表示をBASIC風にLOCATE(X,Y);などと 任意の位置に表示できれば便利ですね。

このプログラムは、順番に見ていけばわかると思います。 練習のために、マクロと関数をごちゃごちゃに使っています。 実際は、こんな変な使い方はやめましょう。 それと、使えそうなエスケープ・シーケンスを全部 マクロにして、これを*****.hというヘッダーファイルにしてしまいます。 そして、自分のプログラムの最初の所に

#include "*****.h"

と入れると、何だかプログラムがうまくなったような 気になれます。

このプログラムを実行すると下の図のようになります。

あとは、文字に色を付けたり、 アンダーラインを引いたりする関数にも挑戦してください。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Nov/21/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。