问题描述
我的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);