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

         

Прокрутка


* int scrollok(win, bf)

Если TRUE, текст в окне win будет прокручен вверх на одну линию, когда курсор находится в правом нижнем углу и напечатан символ.Если FALSE, то курсор остается на прежней позиции.

При включенном scrollok(...) содержимое окна может быть прокручено при помощи нижеследующих функций. (Замечание: оно будет прокручено и в случае, если вы напечатаете новую линию, находясь на последней линии окна, поэтому будьте осторожны со scrollok(...).) * int scroll(win)

Эта функция прокрутит окно (и строки в структуре данных) на одну линию вверх. * int scrl(n) int wscrl(win, n)

Эти функции прокрутят окно stdscr или win вверх или вниз, в зависимости от целого n. Если n положительное, произойдет прокрутка окна на n линий вверх, если n отрицательное - на n линий вниз. * int setscrreg(t, b) int wsetscrreg(win, t, b)

Устанавливают программную область прокрутки.

Следующий код объяснит, как прокручивать текст на экране. Смотри также type.c в директории примеров.

Мы хотим прокрутить текст в окне, имеющем 18 линий и 66 колонок. S[] - это массив символов с текстом. Max_s является номером последней линии в S[]. Clear_line напечатает пробелы с текущей позиции курсора до конца линии, используя текущие атрибуты окна (не A_NORMAL, как это делает clrtoeol). Beg - это последняя линия из s[], изображенная на данный момент на экране. Scroll - это перечень того, что должна сделать функция, показать NEXT или PREVious (следующую или предыдущую) линию текста. enum{PREV,NEXT}; void scroll_s(WINDOW *win, int scroll) { /* пробуем, должны ли мы прокрутить вниз и если что-нибудь есть, * то прокрутить */ if((scroll==NEXT)&&(beg<=(max_s-18))){ /* одна строка вниз */ beg++; /* задаем права на прокрутку */ scrollok(win, TRUE); /* прокручиваем */ wscrl(win, +1); /* отклоняем права на прокрутку */ scrollok(win, FALSE); /* устанавливаем новую строку в последней линии */ mvwaddnstr(win,17,0,s[beg+17],66); /* очищаем последнюю строку от последнего символа до конца * строки. Иначе атрибуты не будут учтены. */ clear_line(66,win); } else if((scroll==PREV)&&(beg>0)){ beg--; scrollok(win, TRUE); wscrl(win, -1); scrollok(win, FALSE); mvwaddnstr(win,0,0,s[beg],66); clear_line(66,win); } wrefresh(win); return; }



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