1

我试图在一个利用 Curses 库的简单窗口中实现删除字符。

基本上,窗口是使用以下边框代码创建的:

box(local_win, 0 , 0); // Set the border of the window to the default border style.

稍后当我继续处理退格键时,我使用以下代码执行此操作:

initscr();
cbreak();
keypad(window, TRUE);
int ch; // The character pressed by the user.

while((ch = wgetch(window)) != EOF)
{
   switch(ch)
   {
      case KEY_BACKSPACE: // Handle the backspace.
      {
         wdelch(window); // Delete the character at the position in the window.

         wrefresh(window);
         refresh();
      }
   }
}

虽然它确实删除了字符,但它最终会从边框中拉出右侧的垂直条,从而在边框上创建一个洞。我在这里做错了什么,还是在这种情况下,我必须在每次删除后手动插入一个空格,以便将边框保持在其初始位置。

感谢您对此的任何帮助!

4

3 回答 3

0

是的,您需要在竖线之前重新插入一个空格,或者(我不确定这是否可能)设置一个小于终端全宽的滚动区域。

于 2012-11-29T02:41:59.453 回答
0

您可能想擦除而不是删除一个字符。

于 2012-11-29T16:08:12.320 回答
0

curses 中通常的做法是创建子窗口,而不是尝试修复窗口。例如,可以创建一个在其box上绘制 的窗口,并创建一个子窗口(并且小于框),在该子窗口中绘制和更新文本

这是一个示例程序(使用derwin):

#include <stdlib.h>
#include <curses.h>
#include <locale.h>

int
main(void)
{
    int ch;
    WINDOW *frame;
    WINDOW *display;
    int xf, yf;

    setlocale(LC_ALL, "");
    initscr();
    cbreak();
    noecho();

    frame = newwin(LINES - 5, COLS - 10, 2, 2);
    box(frame, 0, 0);
    wrefresh(frame);

    getmaxyx(frame, yf, xf);
    display = derwin(frame, yf - 2, xf - 2, 1, 1);

    keypad(display, TRUE);

    while ((ch = wgetch(display)) != ERR) {
        switch (ch) {
        case '\b':
        case KEY_BACKSPACE:
            getyx(display, yf, xf);
            if (wmove(display, yf, xf - 1) != ERR) {
                wdelch(display);
            }
            break;
        default:
            waddch(display, (chtype) ch);
            break;
        }
    }
    endwin();
    return EXIT_SUCCESS;
}
于 2015-04-19T15:20:49.173 回答