版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第一章 Windows 編程基礎(chǔ),Windows應(yīng)用程序,操作系統(tǒng),計(jì)算機(jī)硬件之間的相互關(guān)系,Windows應(yīng)用程序是通過(guò)系統(tǒng)發(fā)送的消息來(lái)處理用戶(hù)輸入的。,向下的箭頭表示操作系統(tǒng)可以操縱輸 出設(shè)備,以執(zhí)行特定的功能。 向上的箭頭表示操作系統(tǒng)能夠感知輸 出設(shè)備狀態(tài)的變化。 以上兩者就是操作系統(tǒng)與計(jì)算機(jī)硬件的 關(guān)系。,關(guān)于API,向下的箭頭表示應(yīng)用程序可以通知操作系統(tǒng)執(zhí)行某個(gè)具體的動(dòng)作,如操作系統(tǒng)能夠控制聲卡發(fā)出聲音,但它并不知道應(yīng)該何時(shí)發(fā)出何種聲音,需要應(yīng)用程序告訴操作系統(tǒng)該發(fā)出什么樣的聲音。這個(gè)關(guān)系好比有個(gè)機(jī)器人能夠完成行走的功能,但是,如果人們不告訴它往哪個(gè)方向上走,機(jī)器人是不會(huì)主動(dòng)行走的。
2、這里的機(jī)器人就是操作系統(tǒng),人們就是應(yīng)用程序。,關(guān)于API,那么,應(yīng)用程序是如何通知操作系統(tǒng)執(zhí)行某個(gè)功能的呢?有過(guò)編程經(jīng)驗(yàn)的讀者都應(yīng)該知道,在應(yīng)用程序中要完成某個(gè)功能,都是以函數(shù)調(diào)用的形式實(shí)現(xiàn)的,同樣,應(yīng)用程序也是以函數(shù)調(diào)用的方式來(lái)通知操作系統(tǒng)執(zhí)行相應(yīng)的功能的。 操作系統(tǒng)所能夠完成的每一個(gè)特殊功能通常都有一個(gè)函數(shù)與其對(duì)應(yīng),也就是說(shuō),操作系統(tǒng)把它所能夠完成的功能以函數(shù)的形式提供給應(yīng)用程序使用,應(yīng)用程序?qū)@些函數(shù)的調(diào)用就叫做系統(tǒng)調(diào)用,這些函數(shù)的集合就是Windows操作系統(tǒng)提供給應(yīng)用程序編程的接口(Application Programming Interface),簡(jiǎn)稱(chēng)Windows API。 如
3、CreateWindow就是一個(gè)API函數(shù),應(yīng)用程序中調(diào)用這個(gè)函數(shù),操作系統(tǒng)就會(huì)按照該函數(shù)提供的參數(shù)信息產(chǎn)生一個(gè)相應(yīng)的窗口。,關(guān)于消息及消息隊(duì)列,向上的箭頭表示操作系統(tǒng)能夠?qū)⑤斎朐O(shè)備的變化上傳給應(yīng)用程序。 如用戶(hù)在某個(gè)程序活動(dòng)時(shí)按了一下鍵盤(pán),操作系統(tǒng)馬上能夠感知到這一事件,并且能夠知道用戶(hù)按下的是哪一個(gè)鍵,操作系統(tǒng)并不決定對(duì)這一事件如何作出反應(yīng),而是將這一事件轉(zhuǎn)交給應(yīng)用程序,由應(yīng)用程序決定如何對(duì)這一事件作出反應(yīng)。 好比有個(gè)蚊子叮了我們一口,我們的神經(jīng)末梢(相當(dāng)于操作系統(tǒng))馬上感知到這一事件,并傳遞給了我們的大腦(相當(dāng)于應(yīng)用程序),我們的大腦最終決定如何對(duì)這一事件作出反應(yīng),如將蚊子趕走,或是將蚊
4、子拍死。 對(duì)事件作出反應(yīng)的過(guò)程就是消息響應(yīng)。,關(guān)于消息及消息隊(duì)列,操作系統(tǒng)是怎樣將感知到的事件傳遞給應(yīng)用程序的呢?這是通過(guò)消息機(jī)制(Message)來(lái)實(shí)現(xiàn)的。操作系統(tǒng)將每個(gè)事件都包裝成一個(gè)稱(chēng)為消息的結(jié)構(gòu)體MSG來(lái)傳遞給應(yīng)用程序,參看MSDN。 MSG結(jié)構(gòu)定義如下: typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;,消息驅(qū)動(dòng)機(jī)制 在Windows應(yīng)用程序中,是通過(guò)接收消息、分 發(fā)消息、處理消息和用戶(hù)進(jìn)行交互的。這種消息驅(qū)動(dòng) 機(jī)制是 Wind
5、ows編程的最大特點(diǎn)。,關(guān)于句柄,句柄(HANDLE),資源的標(biāo)識(shí)。 操作系統(tǒng)要管理和操作這些資源,都是通過(guò)句柄來(lái)找到對(duì)應(yīng)的資源。按資源的類(lèi)型,又可將句柄細(xì)分成圖標(biāo)句柄(HICON),光標(biāo)句柄(HCURSOR),窗口句柄(HWND),應(yīng)用程序?qū)嵗浔℉INSTANCE)等等各種類(lèi)型的句柄。操作系統(tǒng)給每一個(gè)窗口指定的一個(gè)唯一的標(biāo)識(shí)號(hào)即窗口句柄。,消息隊(duì)列,消息隊(duì)列是一個(gè)“先進(jìn)先出的緩存區(qū)”。 通常為某種變量類(lèi)型的數(shù)組,消息隊(duì)列的每個(gè)元素 都是一條消息,操作系統(tǒng)將消息按先后順序放到消息 隊(duì)列中,而應(yīng)用程序總是取走隊(duì)列中的第一條消息。 應(yīng)用程序得到消息后,便知道了用戶(hù)的操作,以及程序狀態(tài)的變化。,
6、Windows應(yīng)用程序的基本流程,WinMain函數(shù),Win是多任務(wù)管理的,同一應(yīng)用程序的多個(gè)窗口可能會(huì)同 時(shí)存,Win系統(tǒng)對(duì)每個(gè)窗口的執(zhí)行稱(chēng)為一個(gè)實(shí)例,并用一個(gè)實(shí)例 句柄來(lái)唯一標(biāo)識(shí)。 WinMain函數(shù)的說(shuō)明如下: int WINAPI WinMain ( HINSTANCE hThisInst,應(yīng)用程序當(dāng)前實(shí)例句柄 HINSTANCe hPrevInst,應(yīng)用程序其他實(shí)例句柄 LPSTR lpCmdLine, 指向程序命令行參數(shù)的指針 Int nCmdShow應(yīng)用程序開(kāi)始執(zhí)行時(shí)窗口顯示方式的整數(shù)值標(biāo)識(shí) ),窗口的創(chuàng)建,創(chuàng)建一個(gè)完整的窗口需要經(jīng)過(guò)下面四個(gè)操作步驟: 設(shè)計(jì)一個(gè)窗口類(lèi); 注冊(cè)窗口
7、類(lèi); 創(chuàng)建窗口; 顯示及更新窗口。,創(chuàng)建窗口,HWND CreateWindow( LPCTSTR lpClassName, / 已注冊(cè)的窗口類(lèi)名 LPCTSTR lpWindowName, / 窗口的標(biāo)題 DWORD dwStyle, / 窗口風(fēng)格 int x, / 窗口的水平位置 int y, / 窗口的垂直位置 int nWidth, / 寬度 int nHeight, / 高度 HWND hWndParent, / 父窗口句柄 HMENU hMenu, / 菜單句柄 HANDLE hInstance, / 實(shí)例句柄 LPVOID lpParam / 參數(shù)數(shù)據(jù) );,提取消息語(yǔ)句GetM
8、essage,BOOL GetMessage ( LPMSG lpMsg, / address of structure with message HWND hWnd, / handle of window UINT wMsgFilterMin, / first message UINT wMsgFilterMax / last message ); 解釋?zhuān)?1、 LPMSG lpMsg 為一個(gè)指向消息結(jié)構(gòu)體的指針 在傳遞參數(shù)過(guò)程當(dāng)中,我們不需要對(duì)其進(jìn)行初始化,定義一個(gè)結(jié)構(gòu)體變量,將地址存放于lpMsg中。通過(guò)函數(shù)調(diào)用,它會(huì)自動(dòng)填充消息結(jié)構(gòu)體的成員變量。,2、窗口句柄 即表示我們獲得的是哪個(gè)窗
9、口的消息。 若將其值設(shè)置為NULL,也就是表示我們可以調(diào)用整 個(gè)線程的任何窗口的消息。 3、指定消息的最小和最大值 表示我們對(duì)消息的選擇過(guò)程,只選擇我們感興趣的消 息。即我們可以指定消息的有效范圍。 可以使用wMsgFilterMin , wMsgFilterMax來(lái)設(shè)定一個(gè)消息的最小,最大值。 參看:WM_KEYFIRST and WM_KEYLAST WM_MOUSEFIRST and WM_MOUSELAST,若兩個(gè)值都設(shè)置為0,則函數(shù)會(huì)返回所有的消息, 即最消息沒(méi)有范圍的過(guò)濾。 4、函數(shù)的返回值類(lèi)型:BOOL 當(dāng)GetMessage使用可以得到消息,則返回為 真,則while為真,則為
10、死循環(huán),能保證程序的不斷 運(yùn)行。若為假,則退出循環(huán)。,轉(zhuǎn)換(翻譯)消息語(yǔ)句TranslateMessage,BOOL TranslateMessage ( CONST MSG *lpMsg / address of structure with message ); 對(duì)取到的消息對(duì)進(jìn)行轉(zhuǎn)換,當(dāng)我們?cè)阪I盤(pán)上有按鍵 時(shí),系統(tǒng)會(huì)產(chǎn)生WM_KEYDOWN, WM_KEYUP 消 息,并且參數(shù)會(huì)有剛才按鍵產(chǎn)生的一個(gè)虛擬的掃描 碼, TranslateMessage會(huì)將WM_KEYDOWN, WM_KEYUP 轉(zhuǎn)換為WM_CHAR 消息,并將轉(zhuǎn)換完 的消息投放到消息隊(duì)列當(dāng)中。,傳遞函數(shù)DispatchMe
11、ssage,將消息傳遞給窗口過(guò)程,即傳給回調(diào)函數(shù)。 也可以理解為: 將消息路由給了操作系統(tǒng),然后操作系統(tǒng)去調(diào)用窗口 過(guò)程函數(shù)。 窗口過(guò)程函數(shù):WinSunProc LRESULT CALLBACK WindowProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter );,WinSunProc用來(lái)接收和處理各種不同的消息。在 VC+開(kāi)發(fā)過(guò)程中,我們必須寫(xiě)成
12、這種形式,但是名 稱(chēng)可以改變,參數(shù)的類(lèi)型不能改變。 DispatchMessage得到消息之后,操作系統(tǒng)回去調(diào) 用WinSunProc函數(shù),并將MSG的前四個(gè)參數(shù)給了 WinSunProc,而我們要判斷產(chǎn)生的是什么消息,利 用switch case語(yǔ)句進(jìn)行判斷,并作出相應(yīng)。,窗口過(guò)程函數(shù),第二個(gè)成員變量lpfnWndProc指定了這一類(lèi)型窗口的過(guò)程函數(shù),也稱(chēng)回調(diào)函數(shù)。回調(diào)函數(shù)的原理是這樣的,當(dāng)應(yīng)用程序收到給某一窗口的消息時(shí)(還記得前面講過(guò)的消息通常與窗口相關(guān)的嗎?),就應(yīng)該調(diào)用某一函數(shù)來(lái)處理這條消息。這一調(diào)用過(guò)程不用應(yīng)用程序自己來(lái)實(shí)施,而由操作系統(tǒng)來(lái)完成,但是,回調(diào)函數(shù)本身的代碼必須由應(yīng)用程序
13、自己完成。對(duì)于一條消息,操作系統(tǒng)到底調(diào)用應(yīng)用程序中的哪個(gè)函數(shù)(回調(diào)函數(shù))來(lái)處理呢?操作系統(tǒng)調(diào)用的就是接受消息的窗口所屬的類(lèi)型中的lpfnWndProc成員指定的函數(shù)。每一種不同類(lèi)型的窗口都有自己專(zhuān)用的回調(diào)函數(shù),該函數(shù)就是通過(guò)lpfnWndProc成員指定的。,設(shè)計(jì)窗口類(lèi),typedef struct _WNDCLASS UINT style; WNDPROClpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTS
14、TR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS;,消息對(duì)話框窗口MessageBox,int MessageBox( HWND hWnd, / handle of owner window LPCTSTR lpText, / address of text in message box LPCTSTR lpCaption, / address of title of message box UINT uType / style of message box );,HDC hdc; device context. 一個(gè)設(shè)備上下文句柄 為系統(tǒng)內(nèi)部維
15、護(hù)的一個(gè)數(shù)據(jù)結(jié)構(gòu)。 微軟為我們提供了DC,用它來(lái)和設(shè)備驅(qū)動(dòng)程序打交 道,借用DC我們只需要下達(dá)命令,而Windows提供了 一個(gè)抽象的接口,稱(chēng)為圖形設(shè)備接口(GDI,Graphical Device Interface),使得用戶(hù)直接利用系統(tǒng)的GDI 函數(shù)就能方便實(shí)現(xiàn)圖形和文本的輸出。而不關(guān)心與系 統(tǒng)的相連的外部設(shè)備的類(lèi)型。 GetDC,/獲取DC ReleaseDC /釋放DC,繪制函數(shù):,HDC BeginPaint ( HWND hwnd, / handle to window LPPAINTSTRUCT lpPaint / pointer to structure for paint
16、information ); 第一個(gè)參數(shù)都是程序的窗口句柄,第二個(gè)參數(shù)是指向 型態(tài)為PAINTSTRUCT的結(jié)構(gòu)指針。PAINTSTRUCT 結(jié)構(gòu)中包含一些窗口消息處理程序,可以用來(lái)更新顯 示區(qū)域的內(nèi)容,它是一個(gè)系統(tǒng)內(nèi)部的結(jié)構(gòu)體,我們不 關(guān)心內(nèi)部的數(shù)據(jù)成員。,WndProc處理的消息為WM_PAINT,這個(gè)消息在 Windows程序設(shè)計(jì)中是很重要的。當(dāng)窗口顯示區(qū)域的一部分顯 示內(nèi)容或者全部變?yōu)椤盁o(wú)效”,以致于必須“更新畫(huà)面”時(shí),將由 這個(gè)消息通知程序。顯示區(qū)域的顯示內(nèi)容怎么會(huì)變得無(wú)效呢? 在最初建立窗口的時(shí)候,整個(gè)顯示區(qū)域都是無(wú)效的,因?yàn)槌?序還沒(méi)有在窗口上畫(huà)什么東西。第一條WM_PAINT消息(通常 發(fā)生在WinMain中調(diào)用UpdateWindow時(shí))指示窗口消息處理 程序在顯示區(qū)域上畫(huà)一些東西。在用戶(hù)改變窗口的大小后,顯 示區(qū)域的顯示內(nèi)容重新變得無(wú)效。 wndclass結(jié)構(gòu)的style字段設(shè)定為標(biāo)志CS_HREDRAW和 CS_VREDRAW,這樣的格式設(shè)定指示W(wǎng)indows,在窗口大小 改變后,就把整個(gè)窗口顯示內(nèi)容當(dāng)成無(wú)效。,文本輸出,BOOL TextOut( HDC hdc,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版農(nóng)村土地整治舊房買(mǎi)賣(mài)合同范本4篇
- 二零二五年度牛奶飲品行業(yè)標(biāo)準(zhǔn)制定與執(zhí)行合同4篇
- 2025年度品牌跨界合作與聯(lián)名推廣合同8篇
- 二零二五年度城市綠地用地使用權(quán)轉(zhuǎn)讓合同
- 二零二五年度農(nóng)藥技術(shù)支持代理銷(xiāo)售合同樣本
- 2025年度鐵藝圍欄出口貿(mào)易采購(gòu)合同
- 二零二五年度新材料研發(fā)采購(gòu)合同(中英文版)3篇
- 二零二五年度外匯市場(chǎng)投資培訓(xùn)借款合同投資培訓(xùn)
- 2025年度個(gè)人二手房買(mǎi)賣(mài)合同履約保證金合同
- 二零二五年度人工智能(AI)技術(shù)咨詢(xún)服務(wù)合同2篇
- 2025年上半年長(zhǎng)沙市公安局招考警務(wù)輔助人員(500名)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 重大事故隱患判定標(biāo)準(zhǔn)與相關(guān)事故案例培訓(xùn)課件
- 2024年度節(jié)后復(fù)工建筑施工安全培訓(xùn)交底
- 藥物制劑工(三級(jí))理論試題題庫(kù)及答案
- 高強(qiáng)度間歇訓(xùn)練(HIIT)對(duì)代謝健康的長(zhǎng)期影響
- ICU患者導(dǎo)管留置登記表
- 中建商務(wù)工作指南手冊(cè)
- 耳鼻咽喉:頭頸外科疾病診斷流程與冶療策略
- 貴州省2023年中考英語(yǔ)真題
- 個(gè)人借條電子版模板
- 中國(guó)思想史 馬工程329P
評(píng)論
0/150
提交評(píng)論