无法将 ncurses 表单与 window 相关联

Unable to associate an ncurses form with a window

我正在尝试将 ncurses 表单与 window 关联。这是我试用的完整代码:

#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和pads很像,但又不一样。 set_form_win 函数需要 window.

newpad 手册页注释:

It is not legal to call wrefresh with a pad as an argument; the routines prefresh or pnoutrefresh should be called instead.

表单库确实使用了便笺簿——在内部,用于 字段 ——但 windows 就是这样(没有便笺簿)。相关函数是wcursyncup and wsyncup (it relies on wgetch for the application for the actual wrefresh调用)。