繁体   English   中英

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

[英]Issue with printing sub-menu in ncurses with c++

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

  1. 做 {} while (); 使用 wgetch 循环获取用户的键盘输入
  2. 如果用户按下回车键,则在清除整个屏幕后显示子菜单条目。

不幸的是,我无法通过第二步,子菜单从未出现在屏幕上。

#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 清除主菜单的屏幕后,子菜单会打印在屏幕上。 谢谢

如果你想在 enter 键上激活子菜单,你应该检查KEY_ENTER根据wgetch返回的值(在数字上类似于 16777221),而不是 10。

您正在混合对不同窗口的调用( clearrefresh使用stdscr ),而您的wgetch调用使用的是获取自己的wrefresh 由于菜单窗口没有被刷新,它永远不会出现,并且由于wgetch做了一个wrefresh可能会另外模糊一些东西。

首先使wrefresh调用应用于您要重新绘制的窗口。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM