首页 > 解决方案 > 如何在 ncursesw 中使用和更新面板

问题描述

我目前在 Ubuntu WSL2 中使用 C++ 进行编码,使用<panel.h>标题在 ncursesw 中创建面板,因为我需要 Unicode 字符。

我已经做了几个测试,结果如下表所示: 在此处输入图像描述

这是使用 WINDOW* 和 -lncursesw 创建窗口时的代码和结果。

代码:

#include <panel.h>

int main() {
    setlocale(LC_ALL, "");
    initscr();
    noecho();
    cbreak();
    refresh();

    WINDOW *window {newwin(0, 0, 0, 0)};
    
    box(window, 0, 0);
    mvwaddstr(window, 1, 1, "\U0001F600");
    wrefresh(window);

    getch();
    endwin();
}

结果:

在此处输入图像描述

这是使用 PANEL* 和 -lncursesw 创建窗口时的代码和结果。

代码:

int main() {
    setlocale(LC_ALL, "");
    initscr();
    noecho();
    cbreak();

    PANEL *panel {new_panel(newwin(0, 0, 0, 0))};

    box(panel_window(panel), 0, 0);
    mvwaddstr(panel_window(panel), 1, 1, "\U0001F600");
    // wrefresh(panel_window(panel));
    update_panels();
    doupdate();

    getch();
    endwin();
}

结果:

在此处输入图像描述

但是,如果我取消注释 wrefresh() 行,我在使用 WINDOW * 时会得到相同的预期结果。为什么会这样?

标签: c++unicodencurses

解决方案


doupdate不做wrefresh(通常在使用 准备好一个窗口后使用wnoutrefresh)。

如果没有明确的wrefresh,您的程序将wrefresh作为的副作用完成getch- 刷新stdscr,但反过来只有待处理werase的 frominitscr后跟box调用:看起来您会得到一个空框。


推荐阅读