HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
ここでは,Curses の用語について説明し, Curses で端末画面がどのように取り扱われるかを示します。
Curses アプリケーションは重なり合う複数のウィンドウであると考えることができます。ウィンドウの重なり合いのことを重なり (occlusion) と呼びます。これらの重なり合うウィンドウの境界を区別するには,四角形のウィンドウに指定の文字で輪郭をつけるか,または反転表示オプションをオンにします ( ウィンドウの表示を明るい背景,暗い描画色に設定します )。
6.3.1 定義済みウィンドウ (stdscr と curscr)
端末画面の初期サイズ設定は, Curses で 2 つのウィンドウによってあらかじめ定義されています。これらのウィンドウを stdscrと curscrと呼びます。 stdscrウィンドウはユーザが使用するために定義されています。多くの Curses マクロのデフォルトはこのウィンドウに設定されています。たとえば, stdscrの周囲に四角形を描き,画面の左上にカーソルを移動し,文字列を stdscrに書き込み,端末画面に stdscrを表示すると,表示は 図 6-1 に示すようになります。
図 6-1 stdscr ウィンドウの例
2 番目の定義済みウィンドウである
curscrは,内部的な Curses の動作のために設計されています。これは,端末画面に現在表示されているもののイメージです。このウィンドウを引数として受け付ける HP C for OpenVMS Curses 関数は
clearokだけです。
curscrに対して,書き込みや読み込みを行うことはできません。すべての Curses アプリケーションで,
stdscrおよびユーザ定義ウィンドウを使用してください。
6.3.2 ユーザ定義ウィンドウ
ユーザは, stdscrの上に自分のウィンドウを重ねることができます。各ウィンドウのサイズと位置は,行数,列数,開始位置によって示されます。
端末画面の行と列によって座標系,つまりウィンドウが作成されるグリッドが形成されます。ウィンドウの開始位置は,ウィンドウの左上の角の (y,x) 座標によって指定します。たとえば,端末画面の座標 (0,0) は画面の左上の角です。
ウィンドウの領域全体が端末画面の境界線の内部になければなりません。ウィンドウのサイズは 1 文字の大きさから端末画面全体の大きさまで,自由に設定できます。また,メモリの範囲内であれば,ウィンドウはいくつでも作成できます。
ウィンドウに書き込んだり,ウィンドウから削除しても,ウィンドウを再表示するまで,端末画面に変更結果は表示されません。ウィンドウを再表示すると,更新されたウィンドウが端末画面に表示されますが,画面の他の部分はそのまま変更されません。
デフォルト設定では,すべてのユーザ定義ウィンドウが stdscrに重なります。 stdscrと重なるだけでなく,互いに重なり合う 2 つ以上のウィンドウを作成することができます。重なり合う一方のウィンドウにデータを書き込んでも,もう一方のウィンドウにデータは書き込まれません。
オーバーラップ・ウィンドウ (サブウィンドウと呼びます) を作成することができます。宣言されるウィンドウには,サブウィンドウの領域全体を収納しなければなりません。データをサブウィンドウに書き込んだり,サブウィンドウがオーバーラップしているウィンドウの部分にデータを書き込むと,どちらのウィンドウにも新しいデータが表示されます。たとえば,サブウィンドウにデータを書き込んだ後,そのサブウィンドウを削除しても,データは下にあるウィンドウにそのまま残されます。
stdscrと重なるウィンドウ,および stdscrのサブウィンドウを作成すると,端末画面は 図 6-2 のようになります。
図 6-2 ウィンドウとサブウィンドウの表示
ユーザ定義ウィンドウとサブウィンドウの両方を削除した後,新しいイメージで端末画面を更新すると,端末画面は 図 6-3 のようになります。
図 6-3 端末画面の更新
ウィンドウに書き込んだ文字列は削除されますが,サブウィンドウに書き込んだ文字列は
stdscrの上に残されます。
6.4 Curses の概要
Curses Screen Management 関数およびマクロを使用するときに,端末画面の初期化と復元のために使用しなければならないコマンドがあります。また,Curses が依存する定義済み変数と定数もあります。 例 6-1 は Curses を使用してプログラムを設定する方法を示しています。
| 例 6-1 Curses プログラム |
|---|
(1)#include <curses.h> (2)WINDOW *win1, *win2, *win3; main() { (3) initscr(); . . . endwin(); } |
例 6-1 の説明:
大部分の Curses ユーザはウィンドウの定義と変更を行う必要があります。 例 6-2 は, 1 つのウィンドウの定義とそのウィンドウへの書き込みの方法を示しています。
| 例 6-2 ウィンドウの操作 |
|---|
#include <curses.h>
WINDOW *win1, *win2, *win3;
main()
{
initscr();
(1) win1 = newwin(24, 80, 0, 0);
(2) mvwaddstr(win1, 2, 2, "HELLO");
.
.
.
endwin();
}
|
例 6-2 の説明:
ほとんどの Curses マクロは,デフォルト設定で stdscrを更新します。他のウィンドウを更新する Curses 関数は,マクロと同じ名前ですが,先頭に接頭語 "w" が付いています。たとえば, addstrマクロは, stdscrの現在のカーソルの位置に指定された文字列を追加します。 waddstr関数は,指定されたウィンドウの現在のカーソルの位置に指定された文字列を追加します。 |
ウィンドウを更新する場合は,端末画面の原点ではなく,ウィンドウの原点を基準にしてカーソルの位置を指定します。たとえば,ウィンドウの開始位置が (10,10) で,ウィンドウの開始位置に文字を追加する場合は,(10,10) ではなく,座標 (0,0) を指定します。
例 6-2 の HELLO という文字列は,画面を再表示するまで端末画面に表示されません。画面を再表示するには, wrefresh関数を使用します。 例 6-3 は,端末画面に win1の内容を表示する方法を示しています。
| 例 6-3 端末画面の再表示 |
|---|
#include <curses.h>
WINDOW *win1, *win2, *win3;
main()
{
initscr();
win1 = newwin(22, 60, 0, 0);
mvwaddstr(win1, 2, 2, "HELLO");
wrefresh(win1);
.
.
.
endwin();
}
|
wrefresh関数は,端末画面で指定されたウィンドウの領域だけを更新します。このプログラムを実行すると,プログラムが
endwin関数を実行するまで, HELLO という文字列が端末画面に表示されます。
wrefresh関数は,端末画面上のウィンドウの中で,別のウィンドウに重なっていない部分だけを再表示します。
win1が別のウィンドウと重なっているときに,
win1の全部を端末画面に表示するには,
touchwin関数を呼び出します。
6.5 定義済み変数と定数
<curses.h>ヘッダ・ファイルには, Curses の実装に役立つ変数と定数が定義されています ( 表 6-2 を参照 )。
| 名前 | 型 | 説明 |
|---|---|---|
| curscr | WINDOW * | 現在の画面のウィンドウ |
| stdscr | WINDOW * | デフォルト・ウィンドウ |
| LINES | int | 端末画面の行数 |
| COLS | int | 端末画面のカラム数 |
| ERR | --- | 異常終了したルーチンのフラグ (0) |
| OK | --- | 正常終了したルーチンのフラグ (1) |
| TRUE | --- | ブール値 TRUE フラグ (1) |
| FALSE | --- | ブール値 FALSE フラグ (0) |
| _BLINK | --- | setattr と clrattr のパラメータ |
| _BOLD | --- | setattr と clrattr のパラメータ |
| _REVERSE | --- | setattr と clrattr のパラメータ |
| _UNDERLINE | --- | setattr と clrattr のパラメータ |
たとえば,定義済みマクロ ERR を使用して, Curses 関数の正常終了または異常終了を判定することができます。 例 6-4 はこのような判定を行う方法を示しています。
| 例 6-4 Curses の定義済み変数 |
|---|
#include <curses.h>
WINDOW *win1, *win2, *win3;
main()
{
initscr();
win1 = newwin(10, 10, 1, 5);
.
.
.
if (mvwin(win1, 1, 10) == ERR)
addstr("The MVWIN function failed.");
.
.
.
endwin();
}
|
例 6-4 で,
mvwin関数が異常終了すると,プログラムは結果を示す文字列を
stdscrに追加します。 Curses の
mvwin関数はウィンドウの開始位置を移動します。
6.6 カーソルの移動
UNIX システム環境では, Curses 関数を使用して端末画面上でカーソルを移動できます。他の実装では, Curses が move関数を使用してカーソルを移動することができ,ユーザが mvcur関数にカーソルの始点と終点を指定することもできます。この関数はカーソルを効率のよい方法で移動します。
HP C for OpenVMS Systems では,2 つの関数は機能的に同じであり,カーソルを移動する効率も同じです。
例 6-5 は, move関数と mvcur関数の使用方法を示しています。
| 例 6-5 カーソル移動関数 |
|---|
#include <curses.h>
main()
{
initscr();
.
.
.
(1) clear();
(2) move(10, 10);
(3) move(LINES/2, COLS/2);
(4) mvcur(0, COLS-1, LINES-1, 0);
.
.
.
endwin();
}
|
例 6-5 の説明:
次のプログラムの例は,多くの Curses マクロと関数の結果を示しています。プログラム・コードの各行の内容の理解に役立つように,各行の右側のコメントに説明が示されています。関数の詳細については,ソース・コード・リストの後の説明を参照してください。
例 6-6 は,1 つのユーザ定義ウィンドウと stdscrの定義および操作を示しています。
| 例 6-6 stdscr と,それに重なるウィンドウ |
|---|
/* CHAP_6_STDSCR_OCCLUDE.C */
/* This program defines one window: win1. win1 is */
/* located towards the center of the default window */
/* stdscr. When writing to an occluding window (win1) */
/* that is later erased, the writing is erased as well. */
#include <curses.h> /* Include header file. */
WINDOW *win1; /* Define windows. */
main()
{
char str[80]; /* Variable declaration.*/
initscr(); /* Set up Curses. */
noecho(); /* Turn off echo. */
/* Create window. */
win1 = newwin(10, 20, 10, 10);
box(stdscr, '|', '-'); /* Draw a box around stdscr. */
box(win1, '|', '-'); /* Draw a box around win1. */
refresh(); /* Display stdscr on screen. */
wrefresh(win1); /* Display win1 on screen. */
(1) getstr(str); /* Pause. Type a few words! */
mvaddstr(22, 1, str);
(2) getch();
/* Add string to win1. */
mvwaddstr(win1, 5, 5, "Hello");
wrefresh(win1); /* Add win1 to terminal scr. */
getch(); /* Pause. Press Return. */
delwin(win1); /* Delete win1. */
(3) touchwin(stdscr); /* Refresh all of stdscr. */
getch(); /* Pause. Press Return. */
endwin(); /* Ends session. */
}
|
例 6-6 の説明:
図 6-4 getch マクロの例
| 前へ | 次へ | 目次 | 索引 |