2 回答

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

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