窗口内打印,而不是在边框上

13

我正在尝试在curses窗口内写入内容,但似乎也会将其写在边框上。如何修复下面的代码?

win_self = newwin(LINES / 2, COLS, 0, 0);
box(win_self, 0, 0);
wrefresh(win_self);
wprintw(win_self, "foobar");
2个回答

17

box()函数生成的边框是内部边框。据我所知,没有简单地说“不要覆盖我的边框”的方法。

尽管如此,目前我能想到三种解决方案:

  • 不要覆盖边框字符(使用move()
  • 在绘制窗口内容后绘制框框,然后refresh()屏幕(您可能仍在覆盖某些东西,但至少不是边框字符)
  • 创建一个“边框窗口”,其自身有边框,并在其中放置一个“内容窗口”,该窗口开始于(border_window_start_y + 1,border_window_start_x + 1),比“边框窗口”小两行/列


只是为了更清楚一点: box()函数不会向窗口添加“此窗口具有可见边框”的属性,它只是在窗口周围打印边框字符。

您可以:

  • 自由地覆盖那些边框字符
  • 如果您不希望它们被覆盖,则应该谨慎对待

1
我选择了第三种解决方案作为临时的hack。现在看来,这个hack已经成为了“生产代码”。 - Alexandru
1
是的,我认为这是最好的解决方案。 - Philip
1
第三个想法真的很好,我也实现了它。但是现在我有一个关于多个重叠窗口和面板的问题。我将外部(边框)窗口分配给面板,但是当我关闭(隐藏)一个窗口时,下面的其他窗口没有被刷新,因为该窗口未被分配到下面的面板...是否还有解决方法?也许需要额外的面板? - aurora
回答我自己的问题:是的,当我使用两个面板(一个用于边框,一个用于内容)时似乎有效。 - aurora
我已经思考了3天如何绕过这个问题,而“创建一个带边框和内容窗口的边框窗口”正是完美的解决方案!!!非常感谢! - Ghost

4
我认为最简单的方法是在窗口边框内创建一个窗口,并在该窗口中打印。
win_self = newwin(LINES / 2, COLS, 0, 0);
box(win_self, 0, 0);
derwin_self = derwin(win_self, LINES / 2 - 2, COLS - 2, 0, 0);
wprintw(derwin_self, "foobar");

derwin() 的起始行和列不应该是 0, 0,而应该是 1, 1 吗? - hackerb9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接