Ko-Window プログラミング、入門編 その4 「簡単にウィンドウを開く」 今までアプリケーションプログラミングに関する基本的なことは説明してきました。 まだまだ全部ではないのですが、いろいろなアプリケーションのソースを見たり、マ ニュアルを読んだりして、1つ1つものにしていって下さい。 ここでは、極めて簡単にウィンドウが開けるライブラリ、MiniTERM (mtmlib.a ま たは libmtm.a) と MgLIB (corlib.a または libcor.a) を少しだけ説明してみたい と思います。 ● MiniTERM (mtmlib.a / libmtm.a) これは、極めて簡単にウィンドウが開け、またある意味でとてつもなく強力なライ ブラリです。このライブラリを使うにあたって、ウィンドウプログラミングの知識は ほとんど必要ありません。printf() や gets() 等、C 言語で使われる一般的な入出力 関数がそのまま使えてしまいます。 ---------------------------------------------------------------------------- #include main() { printf( "Hello World!\n" ); getchar(); } ---------------------------------------------------------------------------- まずはこのプログラムを見て下さい。特殊なのは1行目の #include "mtm_stdio.h" だけで、あとは極普通のC言語のプログラムです。getchar(); というのは、そこで プログラムが一旦止まるようにしているだけです。 このプログラムは次のようにしてコンパイルします。(上のプログラムを smpl.c とす る) XCv2-lib の場合 gcc smpl.c -O -o smpl.win mtm_conf.c -lmtm -lcor parts.a winop.a -lw -ldos -liocs floatfnc.l libc の場合 gcc smpl.c -O -o smpl.win mtm_conf.c -lmtm -lcor -lparts -lwinop -lwin -liocs 長いので途中で行を折り曲げています。mtm_conf.c というのは MiniTERM について くるソースです。そのままコンパイルに加えて構いません。出来上がった smpl.win は、ちゃんとそのままウィンドウプログラムとして実行できます。 またこんなプログラムでも構いません。 ---------------------------------------------------------------------------- #include main() { int a; char buf[100]; for(;;){ printf( "数値を入力して下さい >" ); gets( buf ); if( !*buf ) break; a= atoi( buf ); for(; a-- ;) putchar( '*' ); putchar( '\n' ); } } ---------------------------------------------------------------------------- これは入力した数だけ '*' を表示するプログラムです。空改行でプログラムを抜け ます。これも全く同じようにコンパイルして実行できます。 このように、MiniTERM というのは、C言語にある極普通のプログラムにリンクする だけで、即ウィンドウで動いてしまうというとんでもないライブラリだったりします。 表示にはエスケープシーケンスも通るので、このライブラリを駆使して、スクリーン エディタや rogue 等が Ko-Window に移植されてきました。興味ある方はいろいろ試 してみて下さい。 ● MgLIB (corlib.a / libcor.a) Cのソースをそのままウィンドウで動かそうとした MiniTERM とは違い、MgLIB は Ko-Window のプログラムを簡単に書けるよう作られたものです。 ---------------------------------------------------------------------------- #include int WindowHeapSize= 1024*2; EventExec() { return FALSE; } WindowMain( argc, argv ) char **argv; { MgWindowDefaultOpenArgs( 10, 10, 200, 50, "smpl", argc, argv, Close|Push, EventExec ); } ---------------------------------------------------------------------------- 特殊なコンパイル方法はいりません。入門編その3まで説明してきた方法と同じです。 EventExec() が空ですが、このプログラムを動かすとちゃんとウィンドウが開きます。 (中身は真っ白) それに -x -y オプションで、起動位置指定までできます。 MgLIB はこのように、EventExec() で足りない部分を、勝手に補ってくれるのです。 例えば自分で表示させるよう処理を加えたとすると、EventExec() はこんな感じにな ります。 ---------------------------------------------------------------------------- EventExec( wp, info ) WindowID wp; EventInfo *info; { switch( info->option ){ case EventRedraw: ... return TRUE; } return FALSE; } ---------------------------------------------------------------------------- このように自分で定義した部分は TRUE を返して下さい。つまり、必須のイベントな のに FALSE が返されたら、処理ルーチンがプログラムで定義されてないものとして ライブラリ内のデフォルトルーチンが呼び出されるわけです。 だからデフォルトで構わないところはそのままで、自分で新たに作った部分だけをど んどん記述していけばいいわけです。 この他に MgLIB では、グラフィックを用いる場合の処理や手間も、大幅に軽減して くれるルーチンがついています。 1994 9/04 書き下ろし 1995 9/15 libc 追加と MiniTERM lib の記述ミス修正 -- 小笠原博之 oga@dgw.yz.yamagata-u.ac.jp DenDenNET: DEN0006 COR.