Окна
Окна могут быть созданы, уничтожены, перемещены, скопированы, задублированы и т.д.
* WINDOW *newwin(nlines, ncols, begy, begx)
begy и begx - координаты верхнего левого угла окна. nlines - это число линий (integer); ncols - число колонок (integer). WINDOW *mywin; mywin=newwin(10,60,10,10);
Верхний левый угол нашего окна находится на линии 10 в колонке 10; окно имеет 10 линий и 60 колонок. Если nlines равна нулю, окно будет иметь (LINES - begy) полос. Точно так же, если ncols равна нулю, то окно будет иметь (COLS - begx) колонок. Когда мы вызываем newwin(...) с нулевыми аргументами: WINDOW *mywin; mywin=newwin(0,0,0,0);
открытое окно получает размеры экрана.
При помощи LINES и COLS мы можем открыть окно на середине экрана, какую бы размерность оно ни имело:
0 begx | | 0 | | COLS - - - - -------|-------------------------|-------> | | ncols | begy | |<. . . . . . . . . . . .>| - - - -|- - - -|-------------------------| | ^| | | .| | | .| | |nlines.| newwin(nlines, ncols, | | .| begy, begx) | | v| | |- - - -|-------------------------| LINES | v #define MYLINE (int) ((LINES-22)/2) #define MYCOL ((COLS-70)/2) #define MYLINES 22 #define MYCOLS 70 ... WINDOW *win; ... if(!(initscr())){ fprintf(stderr, "type: iniscr() failed\n\n"); exit(1); } ... if ((LINES<22)(COLS<70)){ fprintf(stderr, "screen too small\n\n"); endwin(); exit (1); } win=newwin(MYLINES,MYCOLS,MYLINE,MYCOL); ...
Откроется окно с 22 линиями и 70 колонками в середине экрана. Проверьте размер экрана перед тем, как открывать окно. Консоль Linux-а имеет не менее 25 линий и 80 колонок, но на x-терминалах это может не выполняться (их размеры изменяемы).
С другой стороны, используйте LINES и COLS, чтобы поместить два окна в один экран:
#define MYROWS (int) (LINES/2+LINES/4) #define MYCOLS (int) (COLS/2+COLS/4) #define LEFTROW (int) ((LINES-MYROWS)/2) #define LEFTCOL (int) (((COLS-2)-MYCOLS)/2) #define RIGHTROW (int) (LEFTROW) #define RIGHTCOL (int) (LEFTROW+2+MYCOLS) #define WCOLS (int) (MYCOLS/2) ... WINDOW *leftwin, *rightwin; ... leftwin=newwin(MYROWS, WCOLS, LEFTROW, LEFTCOL); rightwin=newwin(MYROWS, WCOLS, RIGHTROW, RIGHTCOL); ...
Подробнее смотрите screen.c в директории с примерами.
*int delwin(win)
Удаляет окно win. Подокна win удаляются перед win. Будут освобождены все ресурсы, занятые win. Удаляйте все открытые вами окна перед вызовом endwin().
*int mvwin(win, by, bx)
Перемещает окно на координаты by,bx. Если это означает выход за пределы экрана, то ничего не произойдет и будет возвращен ERR.
* WINDOW *subwin(origwin, nlines, ncols, begy, begx)
Возвращает подокно в середине origwin-а. Когда вы изменяете одно из двух окон (origwin или новое), это изменение отразится на обоих окнах. Вызывайте touchwin(origwin) перед следующим refresh(). begx и begy относятся не к origwin, а к экрану.
* WINDOW *derwin(origwin, nlines, ncols, begy, begx)
То же, что subwin(), begx и begy относятся не к экрану, а к origwin.
* int mvderwin(win, y, x)
Перенесет win за пределы родительского окна. (Пока не реализована.)
* WINDOW *dupwin(win)
Дублирует окно win.
* int syncok(win, bf)
void wsyncup(win)
void wcursyncup(win)
void wsyncdown(win)
(Пока не реализованы.)
* int overlay(win1, win2)
int overwrite(win1, win2)
overlay(...) скопирует весь текст из win1 в win2, игнорируя пропуски. overwrite(...) делает то же самое, но копирует вместе с пропусками.
* int copywin(win1, win2, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, overlay)
То же, что overlay(...) и overwrite(...), но позволяет контролировать область окна для копирования.