无法将ncurses表单与窗口关联

时间:2016-01-07 16:44:59

标签: c++ ncurses

我正在尝试将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的参数如何,表单都会显示在左上角。类似的代码使用菜单就好了,但它不适用于表单。我错过了什么?

作为一个额外的细节,即使没有拨打prefresh或来自refresh家庭的任何其他功能,表格也会神奇地显示。

1 个答案:

答案 0 :(得分:1)

Windows和打击垫类似,但它们不一样。 set_form_win函数需要一个窗口。

newpad手册页说明:

  

致电wrefresh是不合法的   以垫为参数;例程prefresh或   应该调用pnoutrefresh。

表单库确实在内部使用pad,用于字段 - 但窗口就是那样(没有打击垫)。相关功能为wcursyncupwsyncup(它依赖于wgetch申请实际的wrefresh来电。)