2013-02-15 77 views
2

我很難試着讓wgetch在移動和調整大小後從窗口讀取數據。ncurses:在移動/調整窗口大小之後wgetch無法正確讀取

輸入後,我將窗口向上移動並將其高度增加1。然後我清除窗口並將數據寫回到它。問題是我在執行wgetch(或mvwgetch)時,在將窗口向上移動之前,它將輸入光標置於前一個位置。

這裏是我的代碼:

#include <ncurses.h> 

int main() { 
    WINDOW *win=initscr(); 
    int y,x,i=1; 
    getmaxyx(win, y, x); 

    //creates a sub windows 1 col high 
    WINDOW *child=derwin(win, i, x, y-i, 0); 

    //doc says to touch before refresh 
    touchwin(win); 

    //print to child 
    waddstr(child, "hello"); 
    wrefresh(child); 
    wrefresh(win); 

    noecho(); 
    while(wgetch(child)!='q') { 
      ++i; 
      mvderwin(child, y-i, 0); 
      wresize(child, i, x); 
      touchwin(win); 

      wclear(child); 

      waddstr(child,"hello"); 
      wrefresh(child); 
      wrefresh(win); 
    } 
    delwin(child); 
    delwin(win); 
    endwin(); 
} 

這裏所說的「你好」就動起來不如預期,但是,輸入光標是在錯誤的地方。使用mvwgetch仍然會導致相同的問題。 cbreak()noecho()scrollok(child)也似乎沒有幫助。

感謝

編輯:更新後的版本更好的顯示http://liveworkspace.org/code/31DruQ $ 0

+0

這是編譯爲C或C++嗎?你使用什麼編譯選項?你說'輸入光標在錯誤的地方'什麼是「錯誤」的地方?它在哪裏,你會期望它在哪裏? – Mike 2013-02-19 14:08:05

+0

@Mike,代碼編譯並向C或C++編譯器提出同樣的問題,它將要進入的項目是C++。我的意思是錯誤的地方,就是說,如果我從0,0到10,10移動一個派生窗口,然後窗口重新繪製在它的舊地方0,0。 – 111111 2013-02-19 14:30:37

+0

PS:我不認爲在適當的地方創建一個窗口等同於移動框架,除非它可以表明我誤解了wresize和mvderwin應該做的事情。 – 111111 2013-02-19 14:35:09

回答

1

你必須趕上SIGWINCH,當調整終端,其信號發送的問題。做一個endwin(),刷新(),然後重新繪製你的窗口。光標位置是相對於窗口的,而不是實際的終端大小。窗口不會自動調整大小。

編輯:對,你實際上調整窗口大小,而不是終端。在這種情況下,首先對子LAST進行刷新,屏幕上顯示的光標是最後發生的刷新之一。

在你的子窗口周圍放一個盒子,並檢查它們是否正確調整大小/正確移動。

+0

感謝您的回覆。終端沒有被調整大小。我只是想調整和重新定位subwin內的subwin(不是因爲終端大小有變化,但我想要的數據)。我不需要爲此稱呼endwin? – 111111 2013-02-15 11:59:41

+0

當您移動窗口時,光標位置可能未定義。如果要確保它位於特定位置,請使用相對於窗口大小的光標位置保留一個變量,並在窗口上執行操作時對其進行適當更改。使用wmove(3)在窗口中明確地設置光標的位置。 – Anonymous 2013-02-15 12:03:55

+0

再次感謝,我已經換了新的周圍,現在的問題是它現在正在寫你好,以兒童的頂線和窗口的舊位置。光標仍舊在舊位置提示輸入。 – 111111 2013-02-15 12:04:45

相關問題