无法将ncurses表单与窗口关联

Unable to associate an ncurses form with a window

本文关键字:窗口 关联 表单 ncurses      更新时间:2023-10-16

我正在尝试将ncurses表单与窗口相关联。以下是我试用的完整代码:

#include <form.h>
#include <vector>
#include <string>
int main() {
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);
    FORM  *myform;
    std::vector<FIELD *> fields;
    fields.push_back(new_field(1, 10, 0, 0, 0, 0));
    set_field_back(fields[0], A_UNDERLINE);
    fields.push_back(nullptr);
    myform = new_form(fields.data());
    WINDOW *mypad = newpad(5, 20);
    set_form_win(myform, mypad); // no effect?
    post_form(myform);
    prefresh(mypad, 0, 0, 10, 10, 20, 20); // no effect...
    getch();
    unpost_form(myform);
    free_form(myform);
    free_field(fields[0]);
    endwin();
    return 0;
}    

正如评论所示,调用set_form_win似乎没有任何效果。无论我提供给prefresh的参数是什么,表单都显示在左上角。类似的代码可以很好地处理菜单,但不能处理表单。我缺少什么?

作为额外的细节,即使不调用prefreshrefresh家族的任何其他函数,表单也会神奇地显示出来。

Windows和pad相似,但不相同。set_form_win函数需要一个窗口。

newpad手册页面注释:

叫花环是不合法的用垫子作为论据;例程prefresh或应该改为调用pnoutrefresh。

表单库确实使用pad—内部,对于字段—但窗户就是这样(没有垫子)。相关的函数是wcursyncup和wsyncup(实际的wrefresh调用依赖于应用程序的wgetch)。