在ncurses中发布多个表单:最初仅可见最后一个表单

问题描述

我的ncurses程序中有几套表格。每个字段都启用了A_UNDERLINE,但我注意到只有最后发布的表单才会显示下划线,直到我导航到它为止。其他只是空白。

我想确保刷新刷新板时所有字段都带有下划线。 最终,我打算允许用户添加删除表单中的字段,并将表单中的所有字段内容一起编译以进行分析。因此,将所有字段组合为一种形式是可能的,但根本不理想。

由于我是新手,所以我什至应该尝试些什么。在循环输入无济于事之前,我尝试过为每种形式调用form_driver(form,REQ_END_LINE);。以及form_driver(form,REQ_NEXT_FIELD);一样,因为它似乎可以在输入循环中使用。

我显然缺少一些东西,但是我不确定是否没有正确初始化字段/表单,或者只是误解了它们的工作原理。

我为以下问题创建了简化版本:

#include <ncurses.h>
#include <form.h>

int main()
{
    WINDOW *pad;
    FIELD *field[3];
    FORM  *my_form;
    FIELD *field_two[3];
    FORM *form_two;
    int ch;

    initscr();
    cbreak();
    noecho();
    keypad(stdscr,TRUE);
    pad = newpad(LInes,COLS);
    keypad(pad,TRUE);

    field[0] = new_field(1,10,4,18,0);
    field[1] = new_field(1,6,0);
    field[2] = NULL;

    field_two[0] = new_field(1,8,0);
    field_two[1] = new_field(1,0);
    field_two[2] = NULL;

    set_field_back(field[0],A_UNDERLINE);
    set_field_back(field[1],A_UNDERLINE);

    set_field_back(field_two[0],A_UNDERLINE);
    set_field_back(field_two[1],A_UNDERLINE);

    wclear(pad);
    my_form = new_form(field);
    set_form_sub(my_form,pad);
    post_form(my_form);

    form_two = new_form(field_two);
    set_form_sub(form_two,pad);
    post_form(form_two);

    mvwprintw(pad,1,"Some text");
    mvwprintw(pad,"Value 1:");
    mvwprintw(pad,"Value 2:");
    mvwprintw(pad,"Value 3:");
    mvwprintw(pad,"Value 4:");
    prefresh(pad,LInes,COLS);

    bool form1 = true;
    while((ch = getch()) != KEY_F(1))
    {
        switch(ch)
        {   case KEY_DOWN:
                if (form1) {
                    form_driver(my_form,REQ_NEXT_FIELD);
                    form_driver(my_form,REQ_END_LINE);
                } else {
                    form_driver(form_two,REQ_NEXT_FIELD);
                    form_driver(form_two,REQ_END_LINE);
                }
                break;
            case KEY_UP:
                if (form1) {
                    form_driver(my_form,REQ_PREV_FIELD);
                    form_driver(my_form,REQ_PREV_FIELD);
                    form_driver(form_two,REQ_END_LINE);
                }

                break;
            case KEY_RIGHT:
                form1 = false;
                break;
            case KEY_LEFT:
                form1 = true;
                break;
            default:
                if (form1) {
                    form_driver(my_form,ch);
                } else {
                    form_driver(form_two,ch);
                }
                break;
        }
        prefresh(pad,COLS);
    }

    unpost_form(my_form);
    free_form(my_form);
    free_field(field[0]);
    free_field(field[1]);
    unpost_form(form_two);
    free_form(form_two);
    free_field(field_two[0]);
    free_field(field_two[1]);
    endwin();
    return 0;
}

执行上述操作后,在我按一个键之前,我一直处于空白屏幕(如果您想指出为什么我想听这是为什么,但这不是这个问题的重点)。之后,我看到值3和值4的字段带有下划线,但是值1和值2的字段直到我开始输入它们时才出现。

我的目标是在与值1和值2相同的行上添加下划线,而无需任何其他用户输入。

解决方法

通过在post_form(form_two);下立即添加以下代码,我能够实现所有字段都带有下划线的目标。

    set_field_back(field[0],0);
    set_field_back(field[1],0);
    set_field_back(field[0],A_UNDERLINE);
    set_field_back(field[1],A_UNDERLINE);