日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:入出力について
第 3 章:文字/文字列/引数リスト関数
第 4 章:エラー処理とシグナル処理
第 5 章:サブプロセス関数
第 6 章:Curses画面管理関数とマクロ
第 7 章:算術関数
第 8 章:メモリ割り当て関数
第 9 章:システム関数
第 10 章:国際化ソフトウェアの開発
第 11 章:日付/時刻関数
第 12 章:シンボリックリンクとPOSIXパス名
付録 A:各OSバージョンでサポートする関数一覧
付録 B:非標準ヘッダに複製されているプロトタイプ
索引
PDF
OpenVMS ホーム

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


目次 索引



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 マクロの例


  1. touchwin関数は画面を再表示することで, stdscr全体が表示されるようにし,削除した重なり合うウィンドウが画面に表示されないようにします。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.