Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > ncurses проблема c box и выводом в окно


Автор: En_t_end 13.7.2007, 07:17
Создал новое окно newwin'ом. Далее вызвал box для отрисовки границ окна. Начинаю вводить в окно данные, а они затирают границы.

Автор: bsa 13.7.2007, 09:36
попробуй newwin'ом сделать окно внутри бокса.

Автор: En_t_end 13.7.2007, 10:03
bsa, как-то мутно ИМХО, ведь будет два окна по-сути для одной цели.
Ну да ладно, сделал subwin'ом внутри окно, как положено, передал ему аргументы: родительское окно,строчки(уменьшил на 2),столбцы(уменьшил на 2), позиции(соотвественно сдвинул их по осям на +2) и получил странную вещь, как-то ввод туда(в subwin'овское окно) вообще совершить нельзя :( А если делать newwin'ом, то придется ведь при наложении нескольких окон в определенном порядке их перерисовывать, да к тому же при перемещении нужно будет перемещать оба окна, а так subwin'ом - одно.
Код

#include <ncurses.h>
#include <form.h>
#include <sqlite/sqlite3.h>

void draw_background(void)
{
    noecho();
    WINDOW *mywin = newwin(13,13,8,8);
    box(mywin,ACS_VLINE,ACS_HLINE);
    WINDOW *submy = subwin(mywin,10,10,10,10);
    scrollok(submy,TRUE);
    touchwin(mywin);
    refresh();
    int key;
    do
    {
    key = wgetch(submy);
    switch(key)
    {
    case 'w':
        wscrl(submy,1);
        break;
        case 's':
        wscrl(submy,-1);
        break;
    default:
        wechochar(submy,'H');
        break;
    }
    }while(key != 'e');
    wgetch(submy);
    delwin(submy);
    delwin(mywin);
}

int main(int argc,char **argv)
{
    if(argc < 1)
    {
    printf("%s\n","Arguments failed");
    return -1;
    }
    initscr();
    move(10,10);
    draw_background();
    refresh();
    getch();
    endwin();
    return 0;
}


Автор: En_t_end 25.7.2007, 20:01
Сделал так
Код

#include <ncurses.h>

void draw_background(void)
{
    noecho();
    WINDOW *mywin = newwin(14,14,8,8);
    box(mywin,ACS_VLINE,ACS_HLINE);
//    WINDOW *submy = newwin(12,12,9,9);
    WINDOW *submy = derwin(mywin,12,12,1,1);
    scrollok(submy,TRUE);
    touchwin(mywin);
    wrefresh(mywin);
    wrefresh(submy);
    int ypos = 8;
    int xpos = 8;
    int key;
    do
    {
    key = wgetch(submy);
    switch(key)
    {
    case 'w':
        wscrl(submy,1);
        break;
        case 's':
        wscrl(submy,-1);
        break;
    case 't':
        mvwin(mywin,--ypos,xpos);
        break;
    case 'g':
        mvwin(mywin,++ypos,xpos);
        break;
    case 'f':
        mvwin(mywin,ypos,--xpos);
        break;
    case 'h':
        mvwin(mywin,ypos,++xpos);
        break;
    default:
        wechochar(submy,'H');
        break;
    }
    touchwin(mywin);
    wrefresh(mywin);
    wrefresh(submy);
//    refresh();
    }while(key != 'e');
//    wgetch(submy);
    delwin(submy);
    delwin(mywin);
}

int main(int argc,char **argv)
{
    if(argc < 1)
    {
    printf("%s\n","Arguments failed");
    return -1;
    }
    initscr();
    cbreak();
    draw_background();
    refresh();
    getch();
    endwin();
    return 0;
}

Работает так как ожидал, т.е есть окно оформленное соответственно, в него можно осуществлять вывод причем оно прокручиваемо. Теперь проблема немного изменилась, я думал, если создать внтутреннюю рабочую область subwin'ом или derwin'ом то при перемещении родительского окна должно перемещаться и дочернее, но происходит всё как-то жутко, старая дочерняя область остается на месте, появляется новая откуда-то, все сопровождается мусором от старого box'а :( Пожалуйста, гляньте на приложение, кнопки движения:
w - скролирование вверх
s - вниз
t - перемещение родительского окна вверх
g - вниз
f - влево
h - вправо
любая другая кнопка - вывод 'H' в дочернее окно.

Автор: En_t_end 26.7.2007, 16:52
Скорее всего проблема в том, что все же ncurses немногим выше обычного программирования терминала. Поэтому все вещи которые меня здесь интересовали придется решать самостоятельно над ncurses :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)