- 1. 初期化・終了
- 2. 入力制御
- 3. ウィンドウ描画
- 4. 例 端末の設定
- 5. 例 ウィンドウのオープン・クローズ
1. 初期化・終了
わたしの使う主な関数を羅列しておきます。
WINDOW *initscr(void);
WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x);
int delwin(WINDOW *win);
int endwin(void);
「initscr」は、現在の端末の画面を初期化してウィンドウとして使用します。
「endwin」でウィンドウの使用を終了します。
以降の関数はすべて「initscr」~「endwin」の内に記述する必要があります。
「newwin」は、「nlines」行、「ncols」列のウィンドウを、左上の位置「begin_y」「begin_x」から開始します。
「delwin」は、引数のウィンドウを削除します。
2. 入力制御
int echo(void);
int nocbreak(void);
int noecho(void);
int keypad(WINDOW *win, bool bf);
int nodelay(WINDOW *win, bool bf);
int halfdelay(int tenths);
「echo」は、キー入力をエコーバックするようにします。
「noecho」は、キー入力をエコーバックされないようにします。
「keypad」は、「bf」に「true」を指定すると「win」の「wgetch」等でファンクションキーを入力したとき、ファンクションキーのコードを返すようになります。
「bf」に「false」を指定するとキーがエスケープシーケンスとして返されます。(ファンクションキーの体裁でなくなる)
「nodelay」で「bf」に「true」を指定した場合,「wgetch」などの呼び出しが,非ブロッキングモードになります。
非ブロッキングモードでは、入力待ちとならず、バッファにデータがない場合は、エラーが返されます。
「halfdelay」は「thnths × 10 m秒」待って入力が無かった場合エラーとなります。
このモードを抜けるときは、「nocbreak」をコールします。
3. ウィンドウ描画
int mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...);
int werase(WINDOW *win);
int wrefresh(WINDOW *win);
「mvwprintw」は、「win」のウィンドウ位置、「y」行、「x」列へ移動し、「fmt」文字列を表示します。
「werase」は、「win」のウィンドウを消去します。
「wrefresh」は、「win」のウィンドウを現在の表示内容で再描画します。
4. 例 端末の設定
できれば、日本語を使いたいので、最初に端末を日本語表示可能な端末に設定して、終了時に元の状態に戻すようにします。
21行目までが、端末の設定。
23行目で元に戻しています。
#include <errno.h>
#include <locale.h>
#include <ncurses.h>
#include <stdlib.h>
#include <stdio.h>
#define SETTERM "xterm"
int main(int argc , char* argv[])
{
char *aterm; // 端末設定ワーク
setlocale(LC_ALL, "C");
aterm = getenv("TERM");
if (setenv("TERM", SETTERM, 1) != 0)
{
perror("setenv");
return errno;
}
setenv("TERM", aterm, 1);
return 0;
}
5. 例 ウィンドウのオープン・クローズ
上記に、ウィンドウのオープンとクローズを加えます。
ウィンドウのカラム数を 80 行数を 24 としています。
28行目で、ウィンドウの初期化を行っています。
30行目で、新しいウィンドウの作成、32行目でウィンドウの終了を行っています。
#include <errno.h>
#include <locale.h>
#include <ncurses.h>
#include <stdlib.h>
#include <stdio.h>
#define SETTERM "xterm"
#define COLUMN 80 // カラム数
#define LINES 24 // 行数
WINDOW *win;
int main(int argc , char* argv[])
{
char *aterm; // 端末設定ワーク
setlocale(LC_ALL, "C");
aterm = getenv("TERM");
if (setenv("TERM", SETTERM, 1) != 0)
{
perror("setenv");
return errno;
}
initscr();
win = newwin(LINES, COLUMN, 0, 0);
endwin();
setenv("TERM", aterm, 1);
return 0;
}
ここまでの処理で、「make」して実行しても、ほとんど変化はありません。
|