我正在使用ncurses库来编写控制台应用程序。我有一个函数,假设写入窗口缓冲区,然后刷新窗口。在我的测试函数中,我然后调用窗口函数并发生了一些事情,因为程序移动到下一行(getch()只等待我的一个字符),但没有显示任何内容。
这是我的功能:
void UI::drawAudience(int audience1, int audience2)
{
string bar1 = "", bar2 = "";
for (int i; i < BAR_SIZE; i++)
{
bar1 += (i <= audience1) ? ' ' : '+';
if (i <= audience2)
bar2 += '+';
}
string audienceName = "Audience Name";
//mvwprintw(audience, 0, 11 - audienceName.size() / 2, "%s", audienceName.c_str());
//mvwprintw(audience, 1, 0, "%s|%s", bar1.c_str(), bar2.c_str());
wprintw(audience, "Test");
wrefresh(audience);
}
这是我的测试代码:
#include "Tests.h"
#include <string>
using namespace std;
void test()
{
int y = 1;
UI testUI;
initscr();
cbreak();
WINDOW* windowTest = newwin(1, 23, 3, 0);
wprintw(windowTest, "This is a new window");
wrefresh(windowTest);
getch();
clear();
delwin(windowTest);
testUI.drawAudience(4,5);
getch();
endwin();
}
答案 0 :(得分:11)
编辑:问题的原因是getch()
行。通过调用getch(),您的程序将stdscr重新放回顶部。解决方案是使用(https://stackoverflow.com/a/3808913/2372604)中描述的wgetch()
。
我找到的另一个解决方案如下,遗憾的是,这可能不起作用,具体取决于您的UI类的实现。尝试使用以下代码并注释掉refresh()
行,然后尝试重新运行,同时取消注释其中一行(或两行)。如果在刷新窗口之前没有刷新屏幕,则永远不会看到您的窗口。
#include <ncurses.h>
int main(int argc, char** argv)
{
initscr();
cbreak();
refresh(); // Important to refresh screen before refresh window
WINDOW* windowTest = newwin(1, 23, 3, 0);
wprintw(windowTest, "Hello World");
//refresh(); // Refresh here works as well
wrefresh(windowTest);
getch();
delwin(windowTest);
endwin();
return 0;
}
答案 1 :(得分:0)
创建每个窗口后,如@ ilent2所述, stdscr 需要更新以包括新窗口。但是使用wnoutrefresh(stdscr)
可以将相同的效果复制到虚拟屏幕中,而无需调用doupdate()
即可完成实际输出。完成窗口操作后,您就可以自行致电doupdate()
; 减少CPU时间
但更好的解决方案:使用面板
#include <curses.h>
#include <panel.h>
int main()
{
initscr();
// use default width and height
WINDOW* p = newwin(0, 0, LINES/2, COLS/2);
// create a panel of a newly created window
// managing windows is easy now
PANEL* p_panel = new_panel(p);
waddstr(p, "that's what i'm talking about!");
update_panels(); // update windows once and for all
doupdate(); // the actual updating (calculate changes with the curscr)
endwin();
}
如您所见,面板可以提供很大帮助。单独管理每个窗口既乏味又容易出错。所以很明显,您可以创建几个窗口:
WINDOW* win = newwin(height, width, beginy, beginx); // variables defined somewhere
WINDOW* win2 = newwin(height, width, beginy+5, beginx+10);
PANEL* p1 = new_panel(win);
PANEL* P2 = new_panel(win2);
// changing my windows without worrying about updating in the correct order (because they're overlapping)
update_panels();
doupdate();