我的程序有两个版本。一个使用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。我希望他们都是开放的,或更可取的两个功能是在同一个窗口。
1条答案
按热度按时间wkftcu5l1#
在ncurses中,每个窗口都是一个独立的实体,它们彼此不知道。当你刷新一个窗口时,它会被绘制在虚拟屏幕上。实际的屏幕不会更新,直到调用
refresh()
或doupdate()
。在代码中,使用
std::cout
打印徽标和“Hello,world!“消息。但是,std::cout
不能很好地与ncurses一起工作,因为ncurses使用自己的缓冲系统。相反,您应该使用ncurses函数,如printw()
,mvprintw()
,wprintw()
或mvwprintw()
来打印到屏幕或窗口。对于多个窗口的问题,您需要首先创建并刷新所有窗口,然后调用
doupdate()
来更新实际屏幕。这样,所有窗口将同时出现。字符串