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

Posting multiple forms in ncurses: only last form is initially visible

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

我想确保刷新便笺簿后所有字段都带有下划线。 最终,我打算允许用户在表单中添加和删除字段,并将表单中的所有字段内容汇总在一起进行分析。因此,将所有字段都放在一个表格中是可能的,但一点也不理想。

因为我是诅咒的新手,我什至不知道我应该尝试什么。在循环输入无济于事之前,我已经尝试为每个表单调用 form_driver(form, REQ_END_LINE); 。以及 form_driver(form, REQ_NEXT_FIELD); 因为它似乎在输入循环中起作用。

我显然遗漏了一些东西,但我不确定我是否没有正确初始化我的 fields/forms 或者我是否只是误解了它们的工作原理。

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

#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, 0);
    field[1] = new_field(1, 10, 6, 18, 0, 0);
    field[2] = NULL;

    field_two[0] = new_field(1, 10, 8, 18, 0, 0);
    field_two[1] = new_field(1, 10, 10, 18, 0, 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, 1, "Some text");
    mvwprintw(pad, 4, 10, "Value 1:");
    mvwprintw(pad, 6, 10, "Value 2:");
    mvwprintw(pad, 8, 10, "Value 3:");
    mvwprintw(pad, 10, 10, "Value 4:");
    prefresh(pad, 0, 0, 0, 0, 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_END_LINE);
                } else {
                    form_driver(form_two, 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, 0, 0, 0, 0, LINES, 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);