使用C ++在ncurses中打印子菜单的问题

时间:2019-04-27 21:06:28

标签: c++ ncurses

我正在尝试打印与ncurses所示的主菜单关联的子菜单。 这是我组织的方式:

  1. 做{} while(); wgetch循环从用户那里获取键盘输入
  2. 如果用户按下Enter键,则在清除整个屏幕后会显示subMenu条目。

不幸的是,我无法通过第二步,该子菜单从不显示在屏幕上。

#include <ncurses.h>
#include <iostream>
#include <string>

int main()
{ 
    std::string nameMainMenuExample = "/parent1/folder";

    std::string nameSubMenuExample = "/folder/file";

    // initialize ncurses
    WINDOW *win;
    win = initscr();
    raw();
    curs_set(0);
    cbreak();
    box(win, 0, 0); 
    refresh();
    wrefresh(win);
    keypad(win, true);
    // end initialize ncurses

    int highlight = 0;
    int choice;

    // PRESS 'a' to ESCAPE LOOP
    do {
        mvwprintw(win, 1, 1, nameMainMenuExample.c_str());
        switch (choice) {
            case KEY_UP:
                --highlight;
                if (highlight == -1) {
                    highlight = 0;
                }
                break;
            case KEY_DOWN:
                ++highlight;
                if (highlight == 1) {
                    highlight = 0;
                }
                break;
            case KEY_ENTER:                        // Enter key pressed
                clear();
                mvwprintw(win, 1, 1, nameSubMenuExample.c_str());
                refresh();
                break;
            default:
                break;
        }
    } while ((choice = wgetch(win)) != 97); // random choice a == 97

    endwin();
    return 0;
}

我只是希望子菜单在ncurses清除主菜单的屏幕后显示在屏幕上。 谢谢

3 个答案:

答案 0 :(得分:0)

如果要激活回车键上的子菜单,则应检查针对wgetch返回的值KEY_ENTER(在数字上类似于16777221),而不是10。

答案 1 :(得分:0)

您正在将呼叫混合到不同的窗口( clear refresh 使用 stdscr ),您的 wgetch 通话使用的是自己的wrefresh。由于菜单窗口未刷新,因此它永远不会出现,并且由于 wgetch 执行 wrefresh 该操作可能还会使事物模糊。

首先将 wrefresh 调用应用于您要重新粉刷的窗口。

答案 2 :(得分:0)

在C ++中使用ncurses,ENTER键值仅为'\n' 例如:

case '\n':
   clear();
   mvwprintw(win, 1, 1, nameSubMenuExample.c_str());
   refresh();
   break;