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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Windows程序設計入門教程前驟:1.第一個 windows程序:先講幾個專有名詞:HINSTANCE由handle(句柄)和instance (實例)句柄,類似于C中的指針,指向資源,是資源的標識。操作系統(tǒng)要管理和操作這些資源,都是通過句柄(HANDLE)來找到對應的資源。按資源的類型可以分為:窗口句柄HWND實例句柄HINSTANCE圖標句柄HICON光標句柄HCURSOR畫刷句柄HBRUSH設備內容句柄HDC下面是一個簡單的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)這個函數(shù)照著原函數(shù)寫就行。MessageBox的原函數(shù):MessageBox(HWND hWnd, LPCTSTR lpText, LP

3、CTSTR lpCaption, UINT uType)參數(shù)解釋:hWnd:為窗口句柄,h代指handle句柄lpText:要顯示的消息,Ip代指long point長指針lpCaption:消息框的標題uType:消息框的按扭的樣式其中l(wèi)pText和lpCaption的內容可以用TEXT (“”)或直接用(“”)編寫自己的窗口:#include一:主函數(shù)程序的入口點int WINAPI WinMain()設計窗口類:WNDCLASS wndclass;wndclass.style=CS_HREDRAW|CS_VREDRAW;十個字段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)調用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();上面只是給出了一個窗口程序的模板塊,也就是說一個窗口程序主要由這些組成。由上面我們知,要編出 一個窗口程序,就要經過 設計窗口類、注冊窗口類、創(chuàng)建窗口、顯示及更新窗口。再通過系統(tǒng)調用WndProc 函數(shù)(消息處理函數(shù))來使程序不斷運行以及使程序停止。下面我們一個一個完成這些模塊。第零大塊:程序入口點WinMain函數(shù)。照寫。第一大塊:設計窗口類:窗口依照某一窗口類別建立,窗口類別用以標識處理窗口消息的窗口消息處理程序。先定義wndclass結構。接著初始

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

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

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

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

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

11、,初始化窗口的高度NULL,父窗口句柄,這里沒有,所以設為NULLNULL,NULL,父窗口句柄,這里沒有,所以設為NULLNULL,/窗口菜單句柄,沒有,所以設為NULL注意:窗口菜單的系統(tǒng)菜單不同,系統(tǒng)菜單指一個應用程序的最左上角的那個圖標所出現(xiàn)的菜單。hInstance,/hInstance,/程序的執(zhí)行實體句柄NULL);/建立參數(shù)。指標設定為NULL,可用這個參數(shù)/NULL);的數(shù)據(jù)。至此,這個創(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)在必須準備讀入使用者用鍵盤和鼠標輸 入的數(shù)據(jù)oWindows為當前執(zhí)行的每個Windows程序維護一個消息隊列在發(fā)生輸入事件之后,Windows 將事件轉換為一個消息并將消息放入程序的消息隊列中。程序通過執(zhí)行一塊稱之為消息循環(huán)的程序代碼從消息隊列中取出消息:MSG msg;while(GetMessage (&m sg, NULL, 0, 0)TranslateMessage (&m sg);DispatchMessa

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

14、,因為主函數(shù)是int型的,所以得要返回值return msg.wParam;至此,這個主函數(shù)就已經寫完了。好了,現(xiàn)在寫窗口消息處理函數(shù)了。窗口消息處理函數(shù):原函數(shù):LRESULT CALLBACK WndProc(WHND hwnd,UINT message, WPARAM wParam,LPARAM lParam)一般來說,Windows程序寫作者使用switch和case結構來確定窗口消息處理程序接收的是什么消息,以 及如何適當?shù)靥幚硭?。窗口消息處理程序在處理消息時,必須傳回0。窗口消息處理程序不予處理的所有 消息應該被傳給名為DefWindowProc的Windows函數(shù)。從DefWin

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

16、 被遮蓋之后,它就被標志為無效。對這個消息,我們來看一下這個例子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 ;這個消息,幾乎都是從 hdc = BeginPaint (hwnd, &ps),然后由 EndPaint (hwnd, &ps)結束。在h

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

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

19、NT, WPARAM, LPARAM); 對消息處理函數(shù)的聲明int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)主函數(shù),程序的入口點HWNDhwnd ;MSGmsg ;WNDCLASS wndclass ;設計窗口類樣式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í)行實體句柄wndclass.hIcon=LoadIcon (NULL, IDI_APPLICATION);加載圖標wndclass.hCursor=LoadCursor (NULL, IDC_ARROW);wndclass.hIcon=LoadIc

21、on (NULL, IDI_APPLICATION);加載圖標wndclass.hCursor=LoadCursor (NULL, IDC_ARROW);加載光標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 結構傳給 Windows,進行一些鍵盤轉換DispatchMessage (&msg) ;/

溫馨提示

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

評論

0/150

提交評論