2017-02-13 140 views
2

我正在製作一個ncurses程序,將屏幕分成兩個窗口。頂部屏幕可以接受輸入,通過按'#'它會將所有文本向下移動到底部窗口並擦除頂部窗口。在我的代碼中,我試圖使用copywin()來替換底部窗口,但它不會在第二個窗口中粘貼措辭。這是我有...覆蓋窗口

#include <ncurses.h> 

int main(int argc, char *argv[]) 
{ 
// Declare variables for windows and sizes 
WINDOW *top_win, *bottom_win; 
int maxx, maxy, halfy, flag = 0, ch; 

// Start curses 
initscr(); 
noecho(); 
refresh(); 

// get the max x's and y's 
getmaxyx(stdscr, maxy, maxx); 
halfy = maxy >> 1; 

// Start color 
start_color(); 
init_pair(1, COLOR_BLACK, COLOR_WHITE); 
init_pair(2, COLOR_WHITE, COLOR_CYAN); 
init_pair(3, COLOR_RED, COLOR_WHITE); 

// Make windows 
top_win = newwin(halfy, maxx, 0, 0); 
wbkgd(top_win, COLOR_PAIR(1)); 
wrefresh(top_win); 

bottom_win = newwin(halfy, maxx, halfy, 0); 
wbkgd(bottom_win, COLOR_PAIR(2)); 
wrefresh(bottom_win); 

// Allow functions keys 
keypad(top_win, TRUE); 
keypad(bottom_win, TRUE); 

// while loop to get input 
while((ch = getch()) != '`') 
    { 
     if(ch == '@') 
      { 
       if(flag == 1) 
        { 
         flag = 0; 
        } 
       else 
        { 
         flag = 1; 
        } 
      } 
     else if(ch == '#') 
      { 
       //waddstr(bottom_win, "testing"); 
       copywin(top_win, bottom_win, 0, 0, halfy, 0, halfy, maxx, TRUE); 
       //overwrite(top_win, bottom_win); 
       //werase(top_win); 
      } 
     else if(flag != 1) 
      { 
       waddch(top_win, ch | COLOR_PAIR(1)); 
      } 
     else if(flag == 1) 
      { 
       waddch(top_win, ch | COLOR_PAIR(3)); 
      } 
     wrefresh(top_win); 
     wrefresh(bottom_win); 
    } 

// end curses 
delwin(top_win); 
delwin(bottom_win); 
endwin(); 
return 0; 
} 

我知道我可以使用'#'字符打印到窗口,因爲我的註釋掉,測試語句。我也剛剛嘗試使用覆蓋(),但也沒有工作。我只是把爭論混淆了,還是其他的東西?有任何想法嗎?先謝謝你!

回答

1

我沒有一個很好的解釋,爲什麼它的工作,但只要xoffyoff至少1在下面的代碼中,從上層窗口的數據複製到較低的窗口確定(並清除上部窗口)。顏色不被複制。如果任一偏移量爲0,則不會複製數據。字符串testing添加在較低窗口的左上角 - 可以省略,複製的材料仍然可以。

#include <ncurses.h> 

int main(void) 
{ 
    // Declare variables for windows and sizes 
    WINDOW *top_win, *bottom_win; 
    int maxx, maxy, halfy, flag = 0, ch; 

    // Start curses 
    initscr(); 
    noecho(); 
    refresh(); 

    // get the max x's and y's 
    getmaxyx(stdscr, maxy, maxx); 
    halfy = maxy >> 1; 

    // Start color 
    start_color(); 
    init_pair(1, COLOR_BLACK, COLOR_WHITE); 
    init_pair(2, COLOR_WHITE, COLOR_CYAN); 
    init_pair(3, COLOR_RED, COLOR_WHITE); 

    // Make windows 
    top_win = newwin(halfy, maxx, 0, 0); 
    wbkgd(top_win, COLOR_PAIR(1)); 
    wrefresh(top_win); 

    bottom_win = newwin(halfy, maxx, halfy, 0); 
    wbkgd(bottom_win, COLOR_PAIR(2)); 
    wrefresh(bottom_win); 

    // Allow functions keys 
    // keypad(top_win, TRUE); 
    // keypad(bottom_win, TRUE); 

    // while loop to get input 
    int xoff = 1; 
    int yoff = 1; 
    while ((ch = getch()) != '`') 
    { 
     if (ch == '@') 
     { 
      if (flag == 1) 
      { 
       flag = 0; 
      } 
      else 
      { 
       flag = 1; 
      } 
     } 
     else if (ch == '#') 
     { 
      waddstr(bottom_win, "testing"); 
      // copywin(top_win, bottom_win, 0, 0, halfy, 0, halfy, maxx, TRUE); 
      copywin(top_win, bottom_win, 0, 0, yoff, xoff, halfy-yoff, maxx-xoff, TRUE); 
      // overwrite(top_win, bottom_win); 
      werase(top_win); 
     } 
     else if (flag != 1) 
     { 
      waddch(top_win, ch | COLOR_PAIR(1)); 
     } 
     else if (flag == 1) 
     { 
      waddch(top_win, ch | COLOR_PAIR(3)); 
     } 
     wrefresh(top_win); 
     wrefresh(bottom_win); 
    } 

    // end curses 
    delwin(top_win); 
    delwin(bottom_win); 
    endwin(); 
    return 0; 
} 

測試在Mac上運行的MacOS塞拉利昂10.12.3與GCC 6.3.0,使用本地-lncurses庫。

+0

這是很奇怪的。我猜是因爲它在複製所有內容和邊界時存在問題。它的工作原理,並非常感謝你瞭解它!我將不得不深入探討copywin()的參數。 –

+0

是的 - 我懷疑它是與邊框有關的,但'testing'字符串出現在您期望複製的材質出現的地方。正如我所說,我沒有很好的解釋發生了什麼事。我以(10,10)的偏移量開始,並且出現了材料。這導致最小化過程(偏移量2,1和0在10之後嘗試)。如果你想出了一個很好的解釋,請告訴我(例如在這裏發表評論)。 –

3

copywin檢查給定的行/列和decides that your destination rectangle doesn't lie completely within the destination window。這裏有一個快速修復程序:

--- foo.c.orig 2017-02-13 16:13:12.000000000 -0500 
+++ foo.c  2017-02-13 16:30:18.037987489 -0500 
@@ -51,7 +51,7 @@ 
     else if(ch == '#') 
      { 
       //waddstr(bottom_win, "testing"); 
-    copywin(top_win, bottom_win, 0, 0, halfy, 0, halfy, maxx, TRUE); 
+    copywin(top_win, bottom_win, 0, 0, 0, 0, halfy - 1, maxx - 1, TRUE); 
       //overwrite(top_win, bottom_win); 
       //werase(top_win); 
      } 
@@ -73,4 +73,3 @@ 
endwin(); 
return 0; 
} 

行和列從零到最後一個行/列(比窗口大小少一)編號,所以我減去一個從dmaxrowdmaxcol參數。第五個參數dminrow已經過去了窗口的底部。

ncurses檢查參數。關於兼容性和可移植性,使用Solaris curses運行相同的程序(將「ncurses.h」更改爲「curses.h」)會轉儲核心。

的手冊頁可以改進,但很明顯不夠有關colors

只有文字其中兩個窗口重疊複製