2 回答

TA貢獻1810條經驗 獲得超5個贊
理解怎么樣用API來編程.你應該能熟練的運用API來編程.你就會少很多的困惑.親手寫一個API的窗口程序吧!
別的不羅嗦了,現在給你解釋一下:
資源:這個名字已經很清楚了,就是材料,是構建你想要的"窗口"的材料.(當然不只是窗口,還有光標,BIM圖...)就象你要造一個"紅色的門",那些木頭,紅漆呀就是資源.當然,在MFC中,MFC已經給我們造好一個"門",只是這個門沒有顏色(或者就默認的顏色),你要做的就是把這個"門"拿來(這里的門,也是你的資源),你自己可以刷上紅漆,就是你想要的"紅門"了.如果你不想要MFC幫你做的門,你可以自己用一些最基本的資源來做這個門了.
消息:學WINDOWS編程,你應該知道,WINDOWS是消息驅動的.就是說,在他的WinMain函數中,在建立窗口時,會有一個窗口處理函數,在這個窗口處理函數中會有一個消息處理函數,這個消息處理函數是一直在循環的.在循環體內用switch語句來處理不同的消息.形式就如同:
while(1)
{
switch(nMsg)
{
case WM_LBUTTONDOWN:
{
//處理動作....
}
break;
case WM_RBUTTONDOWN:
break;
case WM_USER+1:
break;
case WM_USER+2:
break;
default;
}
}
消息,其實就是你定義的一個"事件"的參數(當然你也可以自己定義).通過2個函數投遞到應用程序的消息隊列中.(SendMessage和PostMessage.)
消息響應函數:很明顯了,就是用來響應消息的函數.這里牽涉到一個"消息映射"的概念,在MFC中,你可以看到ON_MESSAGE(...)這樣的形式,就是將消息和對應的處理函數聯系起來,當一有這樣的消息產生,就會用這個處理函數來處理.
消息處理函數:這個和消息響應函數是一回事.

TA貢獻1798條經驗 獲得超7個贊
我用的不是Linux 所以不太清楚,但應該是newwin()里面的參數有問題
resource ncurses_newwin ( int $rows , int $cols , int $y , int $x )
rows 是長度 , cols 是寬度,y是窗口起點的y坐標,x是窗口起點的x坐標,應該都是int類型~
我看別人都是這么寫的 win = newwin(15, 50, 1, 1);
-------------------------------------------上次回答的分割線---------------------------------------------
PS: 這個是我找到的資料 應該是你所說的問題
我覺得是你在box后少了一句話 wrefresh(win);我這邊沒法編譯所以你自己看著學了~~
/////////////////////////////////////////////////////////////////////
一個窗口的建立是通過一個叫做newwin()的函數開始的。別以為你使用這個函數后會立即在屏幕上出現一個窗口。這個函數的作用是分配內存給窗口相關的數據結構。因此在CURSES里,窗口是一個假想的抽象概念。可以在屏幕中對這個假想中的窗口各個部分進行獨立的控制。newwin()函數返回一個指向窗口的結構指針。這個指針可以被傳送至一些類似于wprintw()這樣需要窗口參數的函數中。使用delwin()函數可以刪除一個窗口,并且釋放存儲窗口數據結構的內存和信息。
我要看見它!
有意思的是,我們創建了一個窗口卻無法看見它。所以我們要做的是如何將窗口顯示出來。box()函數可以用來在已經定義的窗口外圍畫上邊框。讓我們從以下這個例子中探索一下這些函數的詳細信息。
例:帶邊框的窗口:
#include <ncurses.h>
WINDOW *create_newwin(int height, int width, int starty, int startx);
void destroy_win(WINDOW *local_win);
int main(int argc, char *argv[])
{ WINDOW *my_win;
int startx, starty, width, height;
int ch;
initscr(); /* 初始化并進入curses模式 */
cbreak(); /* 行緩沖禁止,傳遞所有控制信息 */
keypad(stdscr, TRUE); /* 程序需要使用F1功能鍵 */
height = 3;
width = 10;
starty = (LINES - height) / 2; /*計算窗口中心位置的行數 */
startx = (COLS - width) / 2; /*計算窗口中心位置的列數 */
printw("Press F1 to exit");
refresh();
my_win = create_newwin(height, width, starty, startx);
while((ch = getch()) != KEY_F(1))
{ switch(ch)
{ case KEY_LEFT:
destroy_win(my_win);
my_win = create_newwin(height, width, starty,--startx);
break;
case KEY_RIGHT:
destroy_win(my_win);
my_win = create_newwin(height, width, starty,++startx);
break;
case KEY_UP:
destroy_win(my_win);
my_win = create_newwin(height, width, --starty,startx);
break;
case KEY_DOWN:
destroy_win(my_win);
my_win = create_newwin(height, width, ++starty,startx);
break;
}
}
endwin(); /*結束 curses模式 */
return 0;
}
WINDOW *create_newwin(int height, int width, int starty, int startx)
{
WINDOW *local_win;
local_win = newwin(height, width, starty, startx);
box(local_win, 0 , 0); /* 0, 0是字符默認的行列起始位置 */
wrefresh(local_win); /*刷新窗口緩沖,顯示 box */
return local_win;
}
void destroy_win(WINDOW *local_win)
{/
* box(local_win, ' ', ' ');不會按照預期的那樣清除窗口邊框。 而是在窗口的四個角落留下殘余字符*/
wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' ');
/*參數注解:
* 1. win:當前操作的窗口
* 2. ls:用于顯示窗口左邊界的字符
* 3. rs:用于顯示窗口右邊界的字符
* 4. ts:用于顯示窗口上邊界的字符
* 5. bs:用于顯示窗口下邊界的字符
* 6. tl:用于顯示窗口左上角的字符
* 7. tr:用于顯示窗口右上角的字符
* 8. bl:用于顯示窗口左下角的字符
* 9. br:用于顯示窗口右下角的字符
*/
wrefresh(local_win);
delwin(local_win);
}
- 2 回答
- 0 關注
- 140 瀏覽
添加回答
舉報