linux C++、Ncurses -无法理解菜单窗口的工作原理

c9qzyr3d  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(142)

我的程序有两个版本。一个使用ncurses,另一个不使用。不使用ncurses的工作得很好,没有什么问题。我想升级我的程序,所以我决定使用ncurses。问题是我不明白窗口系统是如何工作的。没有像样的文档和教程不是很有帮助。我所要求的是关于ncurses中的windows的一般帮助,以及使用我的代码工作的这种功能的示例。
我尝试的是:

//g++ main.cpp -lncurses -W -Wall -Wpedandtic -std=c++23; ./a.out
#include <string>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include "ncurses.h"

void start() {
  initscr();
  noecho();
  std::cout << "Hello, word!" << '\n';
  getch();
}

int main() {
  initscr();
  noecho();
  cbreak();

  int yMax;
  int xMax;
  getmaxyx(stdscr, yMax, xMax);

  std::string line;
  std::ifstream file("resources/graphics/logo.txt");
  if(file.is_open()) {
    while(getline(file, line)) {
      std::cout << line << '\n';
    }
  } else {
    std::cout << "logo.txt could not be found!" << '\n';
  }
  
  WINDOW * menuwin = newwin(6, xMax / 2, 10, xMax / 4);
  keypad(menuwin, true);
  box(menuwin, 0, 0);
  refresh();
  wrefresh(menuwin);

  std::string choices[4] = {"Start", "Continue", "Settings", "Controls"};
  int choice;
  int highlight = 0;
  while(1) {
    for(int i = 0; i < 4; ++i) {
      if(i == highlight) {
    wattron(menuwin, A_REVERSE);
      }
      mvwprintw(menuwin, i + 1, 1, choices[i].c_str());
      wattroff(menuwin, A_REVERSE);
    }
    choice = wgetch(menuwin);
    switch(choice) {
    case KEY_UP:
      highlight--;
      if(highlight == -1) {
    highlight = 0;
      }
      break;
    case KEY_DOWN:
      highlight++;
      if(highlight == 4) {
    highlight = 3 ;
      }
      break;
    default:
      break;
    }
    //keycode 10 = enter;
    if(choice == 10) {
      break;
    }
  }
  if(choices[highlight].c_str() == 0 | 1 | 2 | 3) {
    start();
  }
  //printw("%s", choices[highlight].c_str());
  getch();
  endwin();
}

字符串
我所期望的(图形表示):

####
       #     #   ####   #####   #    #  #   ####   #    #  #  #####   ######
       #        #    #  #    #  ##   #  #  #       #    #  #  #    #  #
       #  ####  #    #  #    #  # #  #  #   ####   ######  #  #    #  #####
       #     #  #    #  #####   #  # #  #       #  #    #  #  #####   #
       #     #  #    #  #   #   #   ##  #  #    #  #    #  #  #   #   #
        #####    ####   #    #  #    #  #   ####   #    #  #  #    #  ######
                                                               #    
       #          ##    #####   #   #  #####   #  #    #    #    #    #
       #         #  #   #    #  #  #   #    #  #  ##   #    #    #    #
       #        #    #  #####    ##    #    #  #  # #  #    #    ######
       #        ######  #    #   #     #####   #  #  # #    #    #    #
       #        #    #  #    #  #      #   #   #  #   ##    #    #    #
       #######  #    #  #####  #       #    #  #  #    #  #####  #    #
                  #             #              #             #
                                                #
                                  Start
                                  Continue
                                  Settings
                                  Controls


我得到了什么(图形表示):

Start
Continue
Settings
Controls[]Hello, world!


[]表示图形毛刺。
我有一个main2.cpp,我试图添加多个窗口,但发生的是它们彼此独立加载。因此,windows1加载,等待输入,然后关闭。然后打开window2。我希望他们都是开放的,或更可取的两个功能是在同一个窗口。

wkftcu5l

wkftcu5l1#

在ncurses中,每个窗口都是一个独立的实体,它们彼此不知道。当你刷新一个窗口时,它会被绘制在虚拟屏幕上。实际的屏幕不会更新,直到调用refresh()doupdate()
在代码中,使用std::cout打印徽标和“Hello,world!“消息。但是,std::cout不能很好地与ncurses一起工作,因为ncurses使用自己的缓冲系统。相反,您应该使用ncurses函数,如printw()mvprintw()wprintw()mvwprintw()来打印到屏幕或窗口。
对于多个窗口的问题,您需要首先创建并刷新所有窗口,然后调用doupdate()来更新实际屏幕。这样,所有窗口将同时出现。

#include <ncurses.h>

int main() {
    initscr();
    noecho();
    cbreak();

    int yMax, xMax;
    getmaxyx(stdscr, yMax, xMax);

    WINDOW *win1 = newwin(yMax / 2, xMax / 2, 0, 0);
    box(win1, 0, 0);
    mvwprintw(win1, 1, 1, "This is window 1");
    wrefresh(win1);

    WINDOW *win2 = newwin(yMax / 2, xMax / 2, yMax / 2, xMax / 2);
    box(win2, 0, 0);
    mvwprintw(win2, 1, 1, "This is window 2");
    wrefresh(win2);

    doupdate();

    getch();
    endwin();

    return 0;
}

字符串

相关问题