Windows程序設(shè)計(jì)入門教程_第1頁
Windows程序設(shè)計(jì)入門教程_第2頁
Windows程序設(shè)計(jì)入門教程_第3頁
Windows程序設(shè)計(jì)入門教程_第4頁
Windows程序設(shè)計(jì)入門教程_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Windows程序設(shè)計(jì)入門教程前驟:1.第一個(gè) windows程序:先講幾個(gè)專有名詞:HINSTANCE由handle(句柄)和instance (實(shí)例)句柄,類似于C中的指針,指向資源,是資源的標(biāo)識(shí)。操作系統(tǒng)要管理和操作這些資源,都是通過句柄(HANDLE)來找到對應(yīng)的資源。按資源的類型可以分為:窗口句柄HWND實(shí)例句柄HINSTANCE圖標(biāo)句柄HICON光標(biāo)句柄HCURSOR畫刷句柄HBRUSH設(shè)備內(nèi)容句柄HDC下面是一個(gè)簡單的windows程序。Copy to clipboardCODE:#include int WINAPI WinMain(HINSTANCE hInstance,HI

2、NSTANCE hPrevInstance,LPSTR szCmdLine, int iCmdShow)MessageBox (NULL, TEXT (Hello, Windows 98!), TEXT (HelloMsg), 0);return 0 ;WinMain的原函數(shù)int WINAPI WinMain (HINSTANCE hlnstance, HINSTANCE hPrevInstance, PSTR szCmdLine, intiCmdShow)這個(gè)函數(shù)照著原函數(shù)寫就行。MessageBox的原函數(shù):MessageBox(HWND hWnd, LPCTSTR lpText, LP

3、CTSTR lpCaption, UINT uType)參數(shù)解釋:hWnd:為窗口句柄,h代指handle句柄lpText:要顯示的消息,Ip代指long point長指針lpCaption:消息框的標(biāo)題uType:消息框的按扭的樣式其中l(wèi)pText和lpCaption的內(nèi)容可以用TEXT (“”)或直接用(“”)編寫自己的窗口:#include一:主函數(shù)程序的入口點(diǎn)int WINAPI WinMain()設(shè)計(jì)窗口類:WNDCLASS wndclass;wndclass.style=CS_HREDRAW|CS_VREDRAW;十個(gè)字段wndclasspszClassName=”Lei”;注冊窗

4、口類:RegisterClass (&wndclass);創(chuàng)建窗口:HWND hwnd; hwnd=CreateWindow();顯示及更新窗口:ShowWindow();UpdateWindow();消息循環(huán):MSG msg;While(GetMessage(&m sg,NULL,O,O)TranlateMessage(&msg);DispatchMessage (&m sg)return msg.wParam;二:消息處理函數(shù)操作系統(tǒng)調(diào)用LRESULT CALLBACK WndProc() PAINTSTRUCT ps;HDC hdc;RECT rect;switch(message)ca

5、se WM_PAINT: return 0;case WM_DESTORY: return 0;return DefWindowProc();上面只是給出了一個(gè)窗口程序的模板塊,也就是說一個(gè)窗口程序主要由這些組成。由上面我們知,要編出 一個(gè)窗口程序,就要經(jīng)過 設(shè)計(jì)窗口類、注冊窗口類、創(chuàng)建窗口、顯示及更新窗口。再通過系統(tǒng)調(diào)用WndProc 函數(shù)(消息處理函數(shù))來使程序不斷運(yùn)行以及使程序停止。下面我們一個(gè)一個(gè)完成這些模塊。第零大塊:程序入口點(diǎn)WinMain函數(shù)。照寫。第一大塊:設(shè)計(jì)窗口類:窗口依照某一窗口類別建立,窗口類別用以標(biāo)識(shí)處理窗口消息的窗口消息處理程序。先定義wndclass結(jié)構(gòu)。接著初始

6、化這結(jié)構(gòu)的10個(gè)字段。WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW ;定義窗口類的樣式/CS為CLASS和STYLE的第一個(gè)字母的縮寫wndclass.lpfnWndProc = WndProc ;/Ipfn 代指:指向函數(shù)的長指針,fn為function的縮寫。/WndProc就是消息處理函數(shù),這個(gè)函數(shù)名可以改,但一定要跟下文定義的函數(shù)名一樣,不過,沒必要改。 這個(gè)函數(shù)通過系統(tǒng)調(diào)用,但代碼必需我們寫。wndclass.cbCIsExtra = 0 ;wndclass.cbWndExtra = 0 ;/這兩個(gè)字段用于在窗口

7、類別結(jié)構(gòu)和Windows內(nèi)部保存的窗口結(jié)構(gòu)中預(yù)留一些額外空間設(shè)定為0,表示不使用它們。wndclass.hlnstance = hInstance ; /程序的執(zhí)行實(shí)體句柄wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); 加載圖標(biāo),當(dāng)加載的圖標(biāo)是標(biāo)準(zhǔn)的圖標(biāo)時(shí),LoadIcon的第一個(gè)參數(shù)必需指定為NULL。IDI為ID和I (ICON)的組合。 /IDI_APPLICTION為應(yīng)用程序的圖標(biāo)。wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); 同上。IDC 中的 C 為 CURSOR /IDC_A

8、RROW表示當(dāng)我們的鼠標(biāo)移到這個(gè)應(yīng)用程序上的時(shí)候?yàn)橐粋€(gè)前頭光標(biāo)。wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);/取得繪制窗口背景的畫刷對象(HBRUSH)為強(qiáng)制轉(zhuǎn)換類型。這里指定為白色畫刷,即這個(gè)程序得到的是 白色背景。wndclass.lpszMenuName = NULL ; 這個(gè)例子無菜單,所以菜單名為NULLwndclass.lpszClassName = “Lei”/這個(gè)類的類名。注意,這里的類名和下文的CreateWindow的第一個(gè) 參數(shù)必需相同。這里定義這個(gè)類名為Lei第二大塊:注冊窗口:RegisterC

9、lass (&wndclass);第三大塊:建立窗口(哈,終于到了創(chuàng)建窗口的時(shí)刻) 先定義窗口句柄:HWND hwnd;然后調(diào)用創(chuàng)建窗口函數(shù)CreateWindow;即為:HWND hwnd;hwnd = CreateWindow (“Lei”,窗口類名,必需和上面的一致。TEXT ( The Hello Program), / 窗口的標(biāo)題WS_OVERLAPPEDWINDOW, / 窗口 的樣式,以 WS_開頭的宏。/ #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED/WS_CAPTION/WS_SYSMENU/WS_THICKFRAME/WS_MINIM

10、IZEBOX/WS_THICKFRAME/WS_MINIMIZEBOX/WS_MAXIMIZEBOX)/可以看出這個(gè)窗口是一個(gè)既有標(biāo)題(WS_CAPTION)又有系統(tǒng)菜(WS_SYSMENU ),也有最小化最大化按扭/(WS_MINIMIZEBOX | WS_MAXIMIZEBOX)CW_USEDEFAULT,/CW_USEDEFAULT,/初始化X的坐標(biāo)位置CW_USEDEFAULT,初始化CW_USEDEFAULT,初始化Y的坐標(biāo)位置CW_USEDEFAULT,初始化窗口的寬度CW_USEDEFAULT,初始化窗口的寬度CW_USEDEFAULT,初始化窗口的高度CW_USEDEFAULT

11、,初始化窗口的高度NULL,父窗口句柄,這里沒有,所以設(shè)為NULLNULL,NULL,父窗口句柄,這里沒有,所以設(shè)為NULLNULL,/窗口菜單句柄,沒有,所以設(shè)為NULL注意:窗口菜單的系統(tǒng)菜單不同,系統(tǒng)菜單指一個(gè)應(yīng)用程序的最左上角的那個(gè)圖標(biāo)所出現(xiàn)的菜單。hInstance,/hInstance,/程序的執(zhí)行實(shí)體句柄NULL);/建立參數(shù)。指標(biāo)設(shè)定為NULL,可用這個(gè)參數(shù)/NULL);的數(shù)據(jù)。至此,這個(gè)創(chuàng)建窗口的函數(shù)已寫完。第四大塊:顯示及更新窗口原函數(shù):ShowWindow(HWND hWnd,int iCmdShow);UpdateWindow(HWND hWnd)于是在這里我們可以寫成

12、:ShowWindow(hwnd,iCmdShow);UpdateWindow(hwnd);第五大塊:消息循環(huán):呼叫UpdateWindow之后,窗口就出現(xiàn)在視訊顯示器上。程序現(xiàn)在必須準(zhǔn)備讀入使用者用鍵盤和鼠標(biāo)輸 入的數(shù)據(jù)oWindows為當(dāng)前執(zhí)行的每個(gè)Windows程序維護(hù)一個(gè)消息隊(duì)列在發(fā)生輸入事件之后,Windows 將事件轉(zhuǎn)換為一個(gè)消息并將消息放入程序的消息隊(duì)列中。程序通過執(zhí)行一塊稱之為消息循環(huán)的程序代碼從消息隊(duì)列中取出消息:MSG msg;while(GetMessage (&m sg, NULL, 0, 0)TranslateMessage (&m sg);DispatchMessa

13、ge (&msg);消息循環(huán)以GetMessage呼叫開始,它從消息隊(duì)列中取出一個(gè)消息:GetMessage(&msg,NULL,0,0)這一呼叫傳給Windows 一個(gè)指標(biāo),指向名為msg的MSG結(jié)構(gòu)。第二、第三和第四個(gè)參數(shù)設(shè)定為NULL 或者0,表示程序接收它自己建立的所有窗口的所有消息TranslateMessage (&msg); 將msg結(jié)構(gòu)傳給Windows,進(jìn)行一些鍵盤轉(zhuǎn)換DispatchMessage (&msg); 又將msg結(jié)構(gòu)回傳給Windowso然后,Windows將該消息發(fā)送給適當(dāng)?shù)拇?口消息處理程序,讓它進(jìn)行處理。這也就是說,Windows將呼叫窗口消息處理程序最后

14、,因?yàn)橹骱瘮?shù)是int型的,所以得要返回值return msg.wParam;至此,這個(gè)主函數(shù)就已經(jīng)寫完了。好了,現(xiàn)在寫窗口消息處理函數(shù)了。窗口消息處理函數(shù):原函數(shù):LRESULT CALLBACK WndProc(WHND hwnd,UINT message, WPARAM wParam,LPARAM lParam)一般來說,Windows程序?qū)懽髡呤褂胹witch和case結(jié)構(gòu)來確定窗口消息處理程序接收的是什么消息,以 及如何適當(dāng)?shù)靥幚硭4翱谙⑻幚沓绦蛟谔幚硐r(shí),必須傳回0。窗口消息處理程序不予處理的所有 消息應(yīng)該被傳給名為DefWindowProc的Windows函數(shù)。從DefWin

15、dowProc傳回的值必須由窗口消息處 理程序傳回。在這個(gè)程序中,我們只處理兩個(gè)消息:WM_PAINT和WM_DESTROY (WM為Window Message的縮寫)。 一. WM_PAINT 引用當(dāng)窗口顯示區(qū)域的一部分顯示內(nèi)容或者全部變?yōu)闊o效,以致于必須更新畫面時(shí),將由這個(gè)消息通 知程序。顯示區(qū)域?yàn)槭裁磿?huì)無效呢?在使用者改變HELLOWIN窗口的大小后,顯示區(qū)域的顯示內(nèi)容重新變得無效當(dāng)使用者將HELLOWIN最小化,然后再次將窗口恢復(fù)為以前的大小時(shí),Windows將不會(huì)保存顯示區(qū)域的 內(nèi)容。在移動(dòng)窗口以致其相互重迭時(shí),Windows不保存一個(gè)窗口中被另一個(gè)窗口所遮蓋的內(nèi)容。在這一部分不再

16、 被遮蓋之后,它就被標(biāo)志為無效。對這個(gè)消息,我們來看一下這個(gè)例子case WM_PAINT:hdc = BeginPaint (hwnd, & ps);GetClientRect (hwnd, & rect);DrawText (hdc, TEXT (Hello, Windows 98!), -1, & rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);EndPaint (hwnd, & ps);return 0 ;這個(gè)消息,幾乎都是從 hdc = BeginPaint (hwnd, &ps),然后由 EndPaint (hwnd, &ps)結(jié)束。在h

17、dc = BeginPaint (hwnd, &ps)之后就是呼叫GetClientRect這個(gè)函數(shù)。第一個(gè)參數(shù)是窗口句柄,第二 個(gè)參數(shù)是一個(gè)指標(biāo),指向一個(gè)RECT型態(tài)的rectangle (矩形)結(jié)構(gòu)。DrawText可以輸出文字(正如其名字所表明的一樣)。由于該函數(shù)要輸出文字,第一個(gè)參數(shù)是從BeginPaint 傳回的設(shè)備內(nèi)容句柄,第二個(gè)參數(shù)是要輸出的文字,第三個(gè)參數(shù)是-1,指示字符串是以字節(jié)0終結(jié)的。DrawText最后一個(gè)參數(shù)是一系列位旗標(biāo),旗標(biāo)指示了文字必須顯示在一行上,水平方向和垂直方向都位于 第四個(gè)參數(shù)指定的矩形中央。WM_DESTROY 消息WM_DESTROY消息是另一個(gè)重要

18、消息。這一個(gè)消息指示,Windows正在根據(jù)使用者的指示關(guān)閉窗口。 該消息是使用者單擊Close按鈕或者在程序的系統(tǒng)菜單上選擇Close時(shí)發(fā)生的(在本章的后面,我們將詳 細(xì)討論WM_DESTROY消息是如何生效的)。HELLOWIN通過呼叫PostQuitMessage以標(biāo)準(zhǔn)方式響應(yīng)WM_DESTROY消息:PostQuitMessage (0);該函數(shù)在程序的消息隊(duì)列中插入一個(gè)WM_QUIT消息。好了,接下來,我們把這個(gè)程序的全部寫下來。Copy to clipboardCODE:#include /這個(gè)程序所要包含的頭文件LRESULT CALLBACK WndProc (HWND, UI

19、NT, WPARAM, LPARAM); 對消息處理函數(shù)的聲明int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)主函數(shù),程序的入口點(diǎn)HWNDhwnd ;MSGmsg ;WNDCLASS wndclass ;設(shè)計(jì)窗口類樣式wndclass.style=CS_HREDRAW | CS_VREDRAW ; 樣式為水平和垂直重畫wndclass.stylewndclass .l pfnWndProc=WndProc ;wndclass .l pfnWndProc=W

20、ndProc ;指定消息處理函數(shù)wndclass.cbClsExtra/不使額外空間wndclass.cbWndExtrawndclass.cbClsExtra/不使額外空間wndclass.cbWndExtra不使額外空間wndclass.hInstance=hInstance wndclass.hInstance=hInstance ;/程序的執(zhí)行實(shí)體句柄wndclass.hIcon=LoadIcon (NULL, IDI_APPLICATION);加載圖標(biāo)wndclass.hCursor=LoadCursor (NULL, IDC_ARROW);wndclass.hIcon=LoadIc

21、on (NULL, IDI_APPLICATION);加載圖標(biāo)wndclass.hCursor=LoadCursor (NULL, IDC_ARROW);加載光標(biāo)wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH) ;/ 取得畫刷對象wndclass.lpszMenuName = NULL ;無窗口菜單,注:不是無系統(tǒng)菜單wndclass .l pszClassName = wndclass .l pszClassName = Lei;窗口類類名,必需與下文一致注冊窗口類RegisterClass (&wndclass);創(chuàng)建窗

22、口hwnd = CreateWindow (Lei,/ window class nameTEXT (The Hello Program), / window captionWS_OVERLAPPEDWINDOW, / window styleCW_USEDEFAULT,/ initial xpositionCW_USEDEFAULT,/ initial ypositionCW_USEDEFAULT,/ initial x sizeCW_USEDEFAULT,/initial y sizeNULL,/ parent window handleNULL,/ window menu handlehInstance,/ program instance handleNULL) ;/ creation parametersShowWindow (hwnd, iCmdShow) ;/ 顯示窗口UpdateWindow (hwnd) ;/ 更新窗口消息循環(huán)while (GetMessage (&m sg, NULL, 0, 0) /從消息對列中取得一條消息TranslateMessage (&msg) ;/ 將 msg 結(jié)構(gòu)傳給 Windows,進(jìn)行一些鍵盤轉(zhuǎn)換DispatchMessage (&msg) ;/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論