; hp; ヒューレット・パッカード;hewlett-packard; ヒューレット;コンパック;compaq; OS; OpenVMS;高い信頼性とスケーラビリティを提供するOS"> - OpenVMSのマニュアルページです。">
日本-日本語

 >  マニュアル >  V8.3ライブラリ

OpenVMS マニュアル


HP OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)


前へ 次へ 目次 索引




6.3 Curses の用語

ここでは,Curses の用語について説明し, Curses で端末画面がどのように取り扱われるかを示します。

Curses アプリケーションは重なり合う複数のウィンドウであると考えることができます。ウィンドウの重なり合いのことを重なり (occlusion) と呼びます。これらの重なり合うウィンドウの境界を区別するには,四角形のウィンドウに指定の文字で輪郭をつけるか,または反転表示オプションをオンにします ( ウィンドウの表示を明るい背景,暗い描画色に設定します )。

6.3.1 定義済みウィンドウ (stdscr と curscr)

端末画面の初期サイズ設定は, Curses で 2 つのウィンドウによってあらかじめ定義されています。これらのウィンドウを stdscrcurscrと呼びます。 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 の説明:

  1. プリプロセッサ・ディレクティブは <curses.h>ヘッダ・ファイルを取り込み,このヘッダ・ファイルが Curses を実装するために使用する構造体と変数を定義します。 <curses.h>ヘッダ・ファイルは <stdio.h>ヘッダ・ファイルを取り込みます。したがって,プログラムのソース・コードで <stdio.h>を再び取り込むことにより,この操作を重複して実行する必要はありません。 Curses 関数やマクロを使用するには, <curses.h>を取り込む必要があります。

  2. 例の中で,WINDOW は <curses.h>に定義されている構造体です。各ユーザ指定ウィンドウはこの方法で宣言しなければなりません。 例 6-1 では, win1win2win3の 3 つのウィンドウが定義されています。

  3. initscr関数はウィンドウの編集セッションを開始し, endwin関数はウィンドウ編集セッションを終了します。 initscr関数は端末画面をクリアし (OpenVMS Curses の場合のみで, BSD ベースの Curses では画面をクリアしません),ウィンドウ stdscrおよび curscrの領域を割り当てます。 endwin関数はすべてのウィンドウを削除し,端末画面をクリアします。

大部分の 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 の説明:

  1. newwin関数は,高さが 24 行,幅が 80 カラム,開始位置が座標 (0,0),つまり端末画面の左上の角であるウィンドウを定義します。プログラムでは,これらの属性を win1に代入しています。座標は (行,カラム) または (y,x) として指定します。

  2. mvwaddstrマクロは, moveマクロと addstrマクロを別々に呼び出した場合と同じ処理を実行します。 mvwaddstrマクロは,カーソルを指定された座標に移動し,文字列を stdscrに書き込みます。

注意

ほとんどの 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 を参照 )。

表 6-2 Curses の定義済み変数と#define 定数
名前 説明
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 の説明:

  1. clearマクロは, stdscrを消去し,カーソルを座標 (0,0) に移動します。

  2. 最初の moveはカーソルを座標 (10,10) に移動します。

  3. 2 番目の moveは定義済み変数 LINES と COLS を使用して,画面の中心を計算します ( 画面上の LINES と COLS の値の半分の値を計算 )。

  4. mvcur関数は絶対アドレッシングを使用します。この関数はカーソルが現在右上の角にあることを要求することにより,画面の左下の角のアドレスを指定できます。カーソルの現在の位置が不確実な場合はこの方法を使用できますが, moveも同様の動作をします。



6.7 プログラムの例

次のプログラムの例は,多くの 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 の説明:

  1. プログラムは入力を待機します。端末画面へのエコー表示は, noechoマクロを使用して禁止されているため,入力した単語は stdscrに表示されません。しかし,マクロは入力された単語をプログラムの他の場所で使用するために,変数 strに格納します。

  2. getchマクロを実行すると,プログラムは一時停止します。画面の確認が完了したら,Return を押すことにより,プログラムを再開できます。 getchマクロは, refreshを呼び出さずに,端末画面で stdscrを再表示します。画面は 図 6-4 のようになります。

図 6-4 getch マクロの例



前へ 次へ 目次 索引



         印刷用画面へ

プライバシー 本サイト利用時の合意事項