|   |  | 日本-日本語 |  | 
| 
 | 
| 
 | 
|  |  |   OpenVMS マニュアル | 
| 
 |  | HP OpenVMS | 
| 目次 | 索引 | 
|  | 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関数を呼び出します。
 
<curses.h>ヘッダ・ファイルには, Curses の実装に役立つ変数と定数が定義されています ( 
表 6-2 を参照 )。  

6.5 定義済み変数と定数

| 名前 | 型 | 説明 | 
|---|---|---|
| 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関数はウィンドウの開始位置を移動します。
 
UNIX システム環境では, Curses 関数を使用して端末画面上でカーソルを移動できます。他の実装では, Curses が
move関数を使用してカーソルを移動することができ,ユーザが
mvcur関数にカーソルの始点と終点を指定することもできます。この関数はカーソルを効率のよい方法で移動します。
 
HP C for OpenVMS Systems では,2 つの関数は機能的に同じであり,カーソルを移動する効率も同じです。
 
例 6-5 は,
move関数と
mvcur関数の使用方法を示しています。
 
 

6.6 カーソルの移動

| 例 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.7 プログラムの例

| 例 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 マクロの例
| 目次 | 索引 | 
|  | ||||||||
| 
 | ||||||||