2014-02-12 32 views
0

我收到一個很奇怪的「bug」,我想你可以稱之爲它。我使用Xcode開發一個簡單的遊戲,並想添加一些簡單的圖形。Ncurses box()函數僅適用於它之前的getch()

爲此,我決定使用ncurses庫。 在學習如何使用curses時,我開始關注如何創建窗口,我將在後面肯定會使用其中一個函數(可能用於健康狀況欄或其他內容),box()函數用於圍繞窗口中的窗口()。我做的簡單測試是在strscr窗口的中心創建一個新窗口,然後調用box()。這樣做的代碼如下:

WINDOW *AboutWindow; 
int width=60,height=12; 
int OffsetX=0,OffsetY=0; 
OffsetX = (getmaxx(stdscr) - width)/2; 
OffsetY = ((getmaxy(stdscr) - height)/2); 
AboutWindow = newwin(height, width, OffsetY, OffsetX); 
getch(); 
box(AboutWindow, 0, 0); 
//getch(); 
wrefresh(AboutWindow); 

奇怪的「錯誤」是,框將只得到,如果殘培()繪製之前我所說的盒()函數被調用。如果我註釋掉getch(),那麼該框不會被繪製。

我完全不知道爲什麼會發生這種情況。謝謝你的幫助。

+0

是否將最後的getch()中std ::法院<<的std ::沖洗有同樣的效果? – OMGtechy

+0

沒有不害怕的工作。仍然會將窗口放在那裏,並在短暫的毫秒內閃爍出框的輪廓,然後消失 – JabbaWook

回答

0

好吧,經過一小時的擺弄之後,我發現很多事情你可以通過擺脫getch(),據我所知(這不是非常廣泛的任何方式!),但是爲了讓它如此你不必每次都按下按鈕來越過那行代碼,你在上面放了一個半延遲()的時間,下面的代碼完美地工作。

WINDOW *AboutWindow; 
int width=60,height=12; 
int OffsetX=0,OffsetY=0; 
OffsetX = (getmaxx(stdscr) - width)/2; 
OffsetY = ((getmaxy(stdscr) - height)/2); 
AboutWindow = newwin(height, width, OffsetY, OffsetX); 
halfdelay(1); 
getch(); 
box(AboutWindow, 0, 0); 
wrefresh(AboutWindow); 
  • 請注意退出halfdelay模式調用CBREAK()函數。
0

好吧,我知道這個問題是舊的,但對於將來參考: 有一種方式來獲得它的工作。

在這裏讀一本關於ncurses的教程http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO後,我想知道是怎麼回事,如果你printw()然後getch()你不必跑refresh()。我認爲它是在getch()中調用的,它刷新了stdscr,它覆蓋了其他窗口的輸出。

所以爲了保持屏幕上的窗口並獲得鍵盤輸入,您必須使用wgetch(WINDOW*)

您的代碼將看起來像:

WINDOW *AboutWindow; 
int width=60,height=12; 
int OffsetX=0,OffsetY=0; 
OffsetX = (getmaxx(stdscr) - width)/2; 
OffsetY = ((getmaxy(stdscr) - height)/2); 
AboutWindow = newwin(height, width, OffsetY, OffsetX); 
box(AboutWindow, 0, 0); 
wgetch(AboutWindow); //also invokes wrefresh()