在 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);
我的 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);