版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Delphi程序員往往習(xí)慣了用VCL元件編程,其實Delphi也能進(jìn)行基于WINDOWS API SDK編程。而且用 Delphi在某些方面效果似乎比用 VisualC+效果還要好。比如本例程,用Delphi 6編譯出來只有9216字節(jié)(9k)而同樣的Visual C+g序卻有16896字節(jié)(17k)。(此例程是筆者從網(wǎng)上下載的 C+源碼例程,其中有c源程序,和編譯好的.exe文件。源代碼經(jīng)筆者改寫成 Delphi代碼。)這證明Delphi編譯器的優(yōu)化效果非常好。API 是(Application Programmi ng In terface)的縮寫,意為應(yīng)用編程界面,它包含了編寫Windo
2、ws所有函數(shù)、數(shù)據(jù)類型。VCL就是以它為基礎(chǔ)進(jìn)行 封裝的,它是應(yīng)用程序在 Windows上運(yùn)行的基礎(chǔ)。通過熟悉使用 WINDOVAPI SDK直接編制WINDOWS序,程序員將對 WINDOWS執(zhí)行機(jī)制有更深入的了解, 從而編寫出更咼效、實用的程序。下面是我們用API函數(shù)建立的第一個程序:1: program HELLOWIN;2:3: uses4:win dows, Messages ,mmsystem;5:6:7:8:var9:sz_app name:array 0.8 of char=HelloWi n #0;10:Win_Class: WNDCLASSEX; / 窗口類11:w_Ha
3、ndle,i nst:HWND;/w_Ha ndle窗口句柄、程序句柄12:w_msg:TMSG; / 消息數(shù)據(jù)13:14:fun ctio n Win dowProc(h_Wnd,u_Msg,w_Param,l_Param: LONGINT):LRESULT;stdcall;15:/回調(diào)函數(shù)16:var p_hdc:hdc;17:p_rect:trect;18:ps : PAINTSTRUCT ;19:begin20:21:22:case u_msg of23:WM_DESTROY : PostQuitMessage (0);24:WM_CREATE : PlaySound (pchar(h
4、ellowin.wav#0),0, SND_FILENAMExSND_ASYNC);25:WM_PAINT :begi n26:p_hdc := Beg inPaint (h_w nd, ps);GetClie ntRect (h_wnd, p_rect);DrawText (p_hdc, pchar(Hello, Windows!#0), -1, p_rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER); En dPa int (h_w nd, ps);end;end;Result := DefWi ndowProc(h_Wnd, u_Msg, w_P
5、aram, l_Param); end;begi nInst := hln sta nee;win_class.cbSize := sizeof (win_class);win_class.style := CS_HREDRAW or CS_VREDRAW ; win_class.lpfnWndProc := Win dowProc ;win_class.cbClsExtra := 0 ;win_class.cbWndExtra := 0 ;win_class.hl nsta nee := Inst ;win_class.hlco n := LoadIcon (0, IDI_APPLICATI
6、ON);win_class.hCursor := LoadCursor (0, IDC_ARROW);win_class.hbrBackgrou nd := HBRUSH (GetStockObject (WHITE_BRUSH); win _class .l pszMe nu Name := nil ;win_class.lpszClassName := sz_AppName ;win_class.hIco nSm := LoadIcon (0, IDI_APPLICATION);RegisterClassEx(Win_Class);w_Ha ndle:=CreateWi ndow(sz_a
7、pp name, pchar(The Hello Program#。), WS_OVERLAPPEDWINDOW,2OO,2OO,3OO,3OO,O,O, In st, nil);ShowWi ndow (w_Ha ndle, SW_SHOWNORMAL);UpdateWi ndow(w_Ha ndle);while(GetMessage(w_msg, 0, 0, 0) do beg inTran slateMessage(w_msg);DispatchMessage(w_msg);end;end.272829303132333435363738394041424344454647484950
8、5152535455565758596061626364656667686970tagWNDCLASSEXA = packed record cbSize: UINT;/style: UINT;/IpfnWndProc: TFNWndProc; / cbCIsExtra: In teger; / cbW ndExtra: In teger;/hln sta nee: HINST;/hIco n: HICON;/hCursor: HCURSOR; / hbrBackgrou nd: HBRUSH; / lpszMe nuName: PAn siChar; / lpszClassName: PAn
9、 siChar; / hIco nSm: HICON;/設(shè)置成窗口類型的大小窗口類風(fēng)格指向該窗口的回調(diào)函數(shù)(本程序為 窗口類變量的擴(kuò)展字節(jié)數(shù)窗口實例的擴(kuò)展字節(jié)數(shù)窗口的實例句柄窗口的圖標(biāo)句柄窗口鼠標(biāo)指針句柄刷新窗口用戶區(qū)背景的畫刷句柄 窗口類包含的菜單的名稱窗口類的名稱窗口的小圖標(biāo)句柄Win dowProc)以上源程序讀者可以直接拷貝到記事本中,把行標(biāo)去掉后另存為.dpr文件,然后用Delphi直接打開,就可以編譯運(yùn)行,之后你就會聽到電腦向你發(fā) 出的問候。(hellowin.wav 文件可以自己用 windows錄音機(jī)錄制)其中主程序(40-70行)的功能如下:設(shè)置窗口變量(42-53行)注冊窗
10、口 (54行)0顯示窗口(59-60行)消息循環(huán)(63-67行)以下根據(jù)以上四部分分別介紹:一、設(shè)置窗口變量:每一個標(biāo)準(zhǔn)的Win dows應(yīng)用程序都至少有一個主窗口,在本程序中代表主窗口的變量就是 Win_Class,它的類型是 WNDCLASSEX 其在windows.pas的聲明如下:end;WNDCLASSEXA = tagWNDCLASSEXA;WNDCLASSEX = WNDCLASSEXA;其中style 的設(shè)置是以下各值通過位運(yùn)算符 or (或)聯(lián)接合成 風(fēng)格含義Windows 系統(tǒng)應(yīng)用程序X.1Di sjJDatchMessaIJseGet Mef1rCS HREDRAW如果窗
11、口寬度發(fā)生改變,重畫整個窗口CS VREDRAW如果窗口咼度發(fā)生改變,重畫整個窗口CS DBLCLKS能感受窗口中的雙擊消息CS NOCLOSE禁用系統(tǒng)菜單中的“關(guān)閉”命令CS OWNDC為該窗口類的各窗口分配各自獨立的設(shè)備環(huán)境CS CLASSDC為該窗口類的各窗口分配一個共享的設(shè)備環(huán)境CS PARENTDC指定子窗口繼承其父窗口的設(shè)備環(huán)境CS_SAVEBITS把被窗口遮掩的屏幕圖象部分作為位圖保存起來。當(dāng)該窗口被移動時,Windows使用被保存的位圖來重建屏幕圖象LpfnWndProc域是一個函數(shù)指針,它指向窗口的“回調(diào)函數(shù)”。本程序 回調(diào)函數(shù)是WindowProc?;卣{(diào)函數(shù)指的是本窗口的消
12、息處理函數(shù)。 所謂“回調(diào)”指的是此函數(shù)在本程序中沒有語句直接調(diào)用它,而調(diào)用它的是windows。每個窗口程序建立好之 后,windows為每個程序維護(hù)一個“消息隊列”。用戶的操作如鼠標(biāo)、鍵盤輸 入等都是先由windows處理接收的,windows判斷如果用戶的操作是針對本窗 口程序的,就把此消息放到程序的消息隊列中。而程序窗口通過消息循環(huán)語 句(本程序的63-67行)取出消息(GetMessage函數(shù)),最后通過調(diào)用DispatchMessage函數(shù)把消息傳回 windows,再由windows調(diào)用回調(diào)函數(shù)(本 程序是 WindowProC處理消息,回調(diào)函數(shù)把消息處理完后(很多缺省消息的 處理
13、是回調(diào)函數(shù)再調(diào)用 windows來處理的),windows結(jié)束DispatchMessage 調(diào)用。應(yīng)用程序進(jìn)行下一個消息處理循環(huán)。其關(guān)系如下圖所示:各種事件消息鍵盤、鼠標(biāo)、端等消息循環(huán) 回調(diào)函數(shù)_丿X _ _ _消息隊列DefWindowProccbCIsExtra和wc.cbWndExtra在大多數(shù)情況下都會設(shè)為0。hln sta nee它的值是應(yīng)用程序的實例句柄,表明該窗口與該實例是相 關(guān)聯(lián)的。hlcon是窗口的圖標(biāo)句柄。 hCursor是窗口的鼠標(biāo)光標(biāo)句柄。hbrBackground是窗口的背景顏色。IpszMe nuName是標(biāo)志菜單資源的字符串。IpszClassName此窗口類的
14、名稱。hIco nSm是窗口的小圖標(biāo)句柄,它是顯示在任務(wù)欄上的小圖標(biāo),和窗口左上角的圖 標(biāo)。二、注冊窗口類:用RegisterClassEx 函數(shù)注冊窗口。其在windows.pas 的聲明如下:functionRegisterClassEx(const WndClass: TWndClassEx): ATOM;stdcall;此函數(shù)的參數(shù)就是窗口類 TwndClassEx,注冊成功后返回非零,反之出錯 返回0。三、創(chuàng)建顯示窗口。創(chuàng)建窗口用CreateWindow函數(shù),他返回一個窗口句柄。其在windows.pas 的聲明如下:fun ctio n CreateWi ndow(lpClassN
15、ame: PChar; lpWi ndowName: PChar; dwStyle: DWORDX, Y, nWidth, nHeight: Integer; hWndParent: HWND;hMenu: HMENU; hInstanee: HINST; lpParam: Pointer): HWND;CreateWi ndow函數(shù)的參數(shù)說明如下:lpClassName創(chuàng)建窗口所用的窗口類的名稱lpWi ndowName 窗口標(biāo)題dwStyle窗口風(fēng)格,定義為普通型*X窗口位置的x坐標(biāo)Y窗口位置的y坐標(biāo)nWidth窗口的寬度nH eigh窗口的高度hWndPare nt父窗口句柄hMe nu
16、菜單句柄hln sta nee應(yīng)用程序?qū)嵗浔鷏pParam是附加數(shù)據(jù)指針第三個參數(shù)dwStyle的值是窗口的風(fēng)格,下表列出了常用的風(fēng)格:風(fēng)格含義WS_OVERLAPPEDWINDO建一個層疊式窗口,有邊框、標(biāo)題欄、系統(tǒng)菜單、最大最 小化按鈕,是以下幾種風(fēng)格的集合: WS OVERLAPPED,WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS MINIMIZEBOX, WS MAXIMIZEBOXWS_POPUPWINDOW創(chuàng)建一個彈出式窗口,是以下幾種風(fēng)格的集合:WS_BORDER,WS_POPUP,WS_SYSWIS_CAPTIC與 WS POPUPWIN
17、DO格必須一起使用才能使窗口菜單可見WS_OVERLAPPED創(chuàng)建一個層疊式窗口,它有標(biāo)題欄和邊框,與WS_TILE風(fēng)格 一樣WS POPUP該窗口為彈出式窗口,不能與 WS CHIL同時使用WS BORDER窗口有單邊框WS CAPTION窗口有標(biāo)題欄WS CHILD該窗口為子窗口,不能與 WS POPUP時使用WS DISABLED該窗口為無效,即對用戶操作不產(chǎn)生任何反應(yīng)WS HSCROLL窗口有水平滾動條WSCONIC窗口初始化為最小化WS MAXIMIZE窗口初始化為最大化WS MAXIMIZEBOX窗口有最大化按鈕WS MINIMIZE與 WS MAXIMIZ一樣WS MINIMIZ
18、EBOX窗口有最小化按鈕WS SIZEBOX邊框可進(jìn)行大小控制的窗口WS_SYSMENU創(chuàng)建一個有系統(tǒng)菜單的窗口,必須與WS_CAPTIC風(fēng)格同時使 用WS THICKFRAME創(chuàng)建一個大小可控制的窗口,與 WS SIZEBO風(fēng)格一樣.WS TILED創(chuàng)建一個層疊式窗口,有標(biāo)題欄WS VISIBLE窗口為可見WS VSCROLL窗口有垂直滾動條顯示窗口用ShowWindoWS數(shù)顯示窗口。其在 windows.pas的聲明如下:fun ction ShowWi ndow(hWnd: HWND; n CmdShow: In teger): BOOL; stdcall; 其第一個參數(shù)hWnd是窗口句
19、柄。第二個參數(shù)nCmdSho決定了如何顯示窗口,其取值含義如下表:值含義S W_FORCEMINIMIZE在WindowNT5.0中最小化窗口,即使擁有窗口的線程被 掛起也會最小化。在從其他線程最小化窗口時才使用這 個參數(shù)。SW MIOE:隱藏窗口并激活其他窗口。SW MAXIMIZE最大化指定的窗口。SW_MINIMIZE最小化指定的窗口并且激活在Z序中的下一個頂層窗口。SW RESTORE激活并顯示窗口。如果窗口最小化或最大化,則系統(tǒng)將窗口恢復(fù)到原來的尺寸和位置。在恢復(fù)最小化窗口時, 應(yīng)用程序應(yīng)該指定這個標(biāo)志。SW SHOW在窗口原來的位置以原來的尺寸激活和顯示窗口。SW_SHOWDEFA
20、ULT依據(jù)在STARTUPINF結(jié)構(gòu)中指定的SW FLA標(biāo)志設(shè)定顯 示狀態(tài),STARTUPINF結(jié)構(gòu)是由啟動應(yīng)用程序的程序傳 遞給CreateProcess函數(shù)的。SW SHOWMAXIMIZED激活窗口并將其最大化。SW SHOWMINIMIZED激活窗口并將其最小化。SW SHOWMINNOACTIVACI窗口最小化,激活窗口仍然維持激活狀態(tài)。SW_SHOWNA以窗口原來的狀態(tài)顯示窗口。激活窗口仍然維持激活狀 態(tài)。SW_SHOWNOACTIVATE以窗口最近一次的大小和狀態(tài)顯示窗口。 激活窗口仍然 維持激活狀態(tài)。SW_SHOWNQMAL激活并顯示一個窗口。如果窗口被最小化或最大化,系 統(tǒng)將
21、其恢復(fù)到原來的尺寸和大小。應(yīng)用程序在第一次顯 示窗口的時候應(yīng)該指定此標(biāo)志。四、建立消息循環(huán)。前面在敘述回調(diào)函數(shù)時,已經(jīng)討論了部分消息循環(huán)這方面的內(nèi)容,在這 我們再詳細(xì)闡述這方面的內(nèi)容。先看代碼63-67行:63:while(GetMessage(w_msg, w_Ha ndle, 0, 0) do64:begin65:Tran slateMessage(w_msg);66:DispatchMessage(w_msg);67:en d;我們已經(jīng)知道GetMessage函數(shù)的功能是程序從消息隊列中取出消息,其在windows.pas中的聲明如下:fun ctio n GetMessage(var
22、lpMsg: TMsg; hWnd: HWND; wMsgFilterMi n,wMsgFilterMax: UINT): BOOL; stdcall;第一個參數(shù)是要接收消息的 MSG結(jié)構(gòu)變量,其聲明為:tagMSG = packed recordhwnd: HWND;message: UINT;wParam: WPARAM;lParam: LPARAM;time: DWORD;pt: TPoi nt;end;$EXTERNALS YM tagMSGTMsg = tagMSG;MSG = tagMSG;$EXTERNALS YM MSG其各域的說明如下:hwnd接收消息的窗口句柄,如果一個應(yīng)用
23、程序中有多個窗口, 此參數(shù) 就可決定讓哪個窗口接收消息。message是一個32位無符號整數(shù),它唯一標(biāo)識了一種消息類型。每種 消息類型都在Messages.PAS文件中定義了,這些常量都以 WM開頭。 比如說當(dāng)窗口建立時, Win dows就向應(yīng)用程序發(fā)送一條 WM_CREATE 息。wParam副消息值,其具體含義依賴于主消息值。 lParam副消息值,其具體含義依賴于主消息值。time消息放入消息隊列中的時間,是從Windows啟動后所測量的時間 值。Windows用這個域來使用消息保持正確的順序。pt消息放入消息隊列時的鼠標(biāo)坐標(biāo)。GetMessage函數(shù)第二個參數(shù)表示窗口句柄,NULL則
24、表示要獲取該應(yīng)用程 序創(chuàng)建的所有窗口的消息;第三,四參數(shù)指定消息范圍。后面三個參數(shù)被設(shè) 置為默認(rèn)值(0,0,0),這就是表示程序?qū)⒔邮账袑儆谒娜魏我粋€窗口 的所有消息。在接收到 WM_QU消息后GetMessage函數(shù)返回假(FALSE,除 了 WM_QUI消息GetMessage函數(shù)對其余消息都返回 TRUE因此,在接收到 WM_QU之前,程序中的消息循環(huán)(63-67行)可以一直循環(huán)下去。在接收到 WM_QUI之后意味著程序消息循環(huán)結(jié)束,終止程序。在GetMessage函數(shù)執(zhí)行后是 TranslateMessage函數(shù),此函數(shù)進(jìn)行一些 鍵盤消息轉(zhuǎn)換(以后在詳細(xì)討論)。然后是Dispatc
25、hMessage函數(shù)將消息結(jié)構(gòu)回傳給Windows Windows再調(diào)用程序本身的回調(diào)函數(shù)來完成各種消息的處理,以便程序?qū)崿F(xiàn)各種功能。在 此我們詳細(xì)看一下回調(diào)函數(shù)的結(jié)構(gòu)。本程序的回調(diào)函數(shù)是從14行到35行:14:fun ctio n Win dowProc(h_Wnd,u_Msg,w_Param,l_Param: LONGINT):LRESULT;stdcall;15:回調(diào)函數(shù)16:var p_hdc:hdc;17: p_rect:trect;18: ps : PAINTSTRUCT ;19:begin20:2122:case u_msg of23: WM_DESTROY : PostQuit
26、Message (0);24: WM_CREATE :PlaySou nd(pchar(hellowi n.wav#0),0,SND_FILENAME or SND_ASYNC);25: WM_PAINT :begin26:p_hdc := Begi nPaint (h_w nd, ps);27:GetClie ntRect (h_wnd, p_rect);28:DrawText (p_hdc, pchar(Hello, Win dows!#0), -1,p_rect,29:DT_SINGLELINE or DT_CENTER orDT_VCENTER);30:En dPai nt (h_wn
27、d, ps);31:en d;32:33: end;34: Result := DefWi ndowProc(h_Wnd, u_Msg, w_Param, l_Param);35:en d;回調(diào)函數(shù)(本例是WindowProO的參數(shù)格式是固定的,四個 32位長整數(shù): h_wnd是接收消息窗口的句柄(實際上就是 32位長整數(shù)) u_Msg是主消息值 w_Param是副消息值 l_Param是副消息值容易看出本程序處理了三個消息:WM_DESTR(注銷窗口消息,第23行,施行停機(jī)處理。此消息只出 現(xiàn)一次,即窗口關(guān)閉時。WM_CREA窗口建立消息,第24行用PlaySound函數(shù)播放一段.wav 聲
28、音文件文件。此消息只出現(xiàn)一次,即窗口創(chuàng)建時。WM_PAINT窗口重畫消息,第25行到第31行,在窗口的用戶區(qū)當(dāng) 中位置顯示“ Hello, Windows! ”。此消息發(fā)生的比較頻繁,當(dāng)窗口 被調(diào)整大小時,被遮擋重新顯示時等都發(fā)生此消息。此段程序的原 理在下一節(jié)詳細(xì)論述。由程序結(jié)構(gòu)可以知道,回調(diào)函數(shù)主要用了 case語句解析判斷u_msg中的 消息,做分門別類的處理。以上程序只處理了三條消息,實際上在消息隊列 中還有很多消息,比如: WM_MO(窗口移動)、WM_KEYDOWN盤消息)、WM_RBUTTONDOW標(biāo)按鍵消息)等等,這些消息需要 Win dows進(jìn)行處理, 為此在函數(shù)的最后,需要調(diào)用 DefWindowProc函數(shù)讓 Windows來對所有消息 進(jìn)行缺省處理。綜合以上所述,一個標(biāo)準(zhǔn)的 Win dows程序分成兩部分: 主程序建立程序
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安徽高考狀元的數(shù)學(xué)試卷
- 燒結(jié)帶冷機(jī)大修施工方案
- 沭陽工程竹膠板施工方案
- 甘肅仿木欄桿安裝施工方案
- 初中魯教版六上數(shù)學(xué)試卷
- 北大師范版數(shù)學(xué)試卷
- 跨境物流優(yōu)化合作協(xié)議
- 企業(yè)信息化平臺建設(shè)項目合同
- 人工智能技術(shù)授權(quán)協(xié)議
- 安徽專升本高數(shù)數(shù)學(xué)試卷
- 《XL集團(tuán)破產(chǎn)重整方案設(shè)計》
- 智慧金融合同施工承諾書
- 術(shù)后甲狀旁腺功能減退癥管理專家共識
- 【7道期末】安徽省安慶市區(qū)2023-2024學(xué)年七年級上學(xué)期期末道德與法治試題(含解析)
- 2024年01月22094法理學(xué)期末試題答案
- 漢字文化解密學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 國家開放大學(xué)電大本科《工程經(jīng)濟(jì)與管理》2023-2024期末試題及答案(試卷號:1141)
- TBT3134-2023機(jī)車車輛驅(qū)動齒輪箱 技術(shù)要求
- 河北省石家莊市橋西區(qū)2022-2023學(xué)年七年級上學(xué)期期末地理試卷
- 《傳播學(xué)概論》核心課程建設(shè)方案
- 家庭、學(xué)校、社會協(xié)同育人PPT課件
評論
0/150
提交評論