Руководство программиста для Linux

    778b1c86   

Окна


Окна могут быть созданы, уничтожены, перемещены, скопированы, задублированы и т.д.

* 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(...), но позволяет контролировать область окна для копирования.


Содержание раздела