【问题标题】:How to avoid stdscr overlapping in ncurses?如何避免stdscr在ncurses中重叠?
【发布时间】:2017-02-23 16:06:00
【问题描述】:

在我的应用程序中,我有两个 WINDOW 对象,它们将终端窗口一分为二,就像一个分屏。但是当我使用 wprintw() 我在屏幕上看不到任何输出。我敢肯定,stdscr 与这两个窗口重叠。我怎样才能避免这种重叠? 也许我需要使用 wrefresh()refresh()?我试过了,但没有用。
这是我的代码的简化部分。也许我做错了什么?

WINDOW *win1 = newwin(10, width, 0, 0);
WINDOW *win2 = newwin(10, width, width, 0);

wprintw(win1, "First window: ");
wprintw(win2, "Second window: ");

wrefresh(win1);
wrefresh(win2);

while((ch = getch()) != KEY_F(2)) {}

endwin();

【问题讨论】:

    标签: c++ ncurses curses


    【解决方案1】:

    stdscr 根据定义覆盖屏幕,因此它始终与您创建的任何其他窗口重叠。如果你想拥有多个窗口,解决方案是避免使用stdscr

    但是你引用stdscr 的地方可能并不明显——它在对getch() 的调用中,也可以读作wgetch(stdscr)。这是一个隐含的wrefresh(stdscr)。这会用stdscr 的(空白)内容覆盖屏幕。

    您可以通过将getch() 调用更改为wgetch(win1)wgetch(win2) 来避免此问题。在这个例子中,你选择哪个窗口并不重要;如果您正在显示输入,您会希望使用应该出现输入的窗口。

    或者,您可以在程序开始时调用refresh(),然后刷新win1win2。然后,只要您从未向stdscr 写过任何内容,您就可以随意使用getch(),因为隐含的refresh() 不会在要显示的窗口中找到任何更新的内容。

    【讨论】:

    • 假设我有 2 个窗口,一个在左上角,另一个在另一个区域。 wgetch(win2) 如何检测到该键被按下?仅当光标位于同一区域时?
    • 输入队列真的只有一个。将特定的窗口指针传递给 wgetch() 告诉 curses 输出 应该出现的位置,以及使用该窗口的特定于窗口的输入设置(键盘、超时等)。跨度>
    【解决方案2】:

    抱歉各位浪费了你们的时间!我自己找到了答案! 代码如下:

    WINDOW *win1, *win2;
    int maxx, maxy, halfx;
    
    getmaxyx(stdscr, maxy, maxx);
    halfx = maxx >> 1;
    
    win1 = newwin(maxy, halfx, 0, 0);
    wgetch(win1, "First window");
    wrefresh(win1);
    
    win2 = newwin(maxy, halfx, 0, halfx);
    wgetch(win2, "Second window");
    wrefresh(win2);
    

    【讨论】:

    • 这与原始问题中的代码不同(甚至没有任何输入),因此尚不清楚这是如何解决问题的。
    • 当然没有输入,因为我这里没有包含。但它很好地解决了我的问题——stdscr 没有重叠。也许我需要更清楚地解释解决方案。感谢you,他解释了 getch() 函数默认使用 stdscr
    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 2023-04-06
    • 1970-01-01
    • 2018-02-12
    • 2016-05-03
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多