2012-11-29 35 views
1

我試圖在利用Curses庫的簡單窗口中實現刪除字符。Curses Library Backspace問題

基本上,窗口得到與邊框下面的代碼創建:

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(); 
     } 
    } 
} 

儘管它刪除了字符,但它最終會從邊框中拉出右側的垂直條,因此會在邊框中創建一個洞。我在這裏做錯了什麼,或者是這種情況,我必須在每次刪除後手動插入空格,以便將邊框保留在其初始位置。

感謝您的任何幫助!

回答

0

是的,您需要在垂直條之前重新插入一個空格,或者(我不確定是否可以)再設置一個小於終端全寬的滾動區域。

+0

謝謝,我會盡力實施,從現在回來後的結果。 –

0

您可能想刪除而不是刪除一個字符。

+0

嗯,這實際上是一個好主意,我會考慮這個解決方案,因爲我受到了側面影響,從來沒有嘗試插入空間。 –

+0

我只是去嘗試這個,但它似乎詛咒(不使用ncurses),或至少我的實現,不包括erasewchar(WIN * W)函數,我需要,因爲這種刪除發生在窗口中。任何其他的選擇? –

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; 
}