




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Windows編程基礎(chǔ)知識,2學(xué)時,程序設(shè)計實踐,主要內(nèi)容,1 概述 2 Windows編程基礎(chǔ) 3 Windows程序結(jié)構(gòu) 4 動手寫第一個Windows程序 5 小結(jié),C+實踐課,2,2020/7/28,1. 概述,Windows應(yīng)用程序 Windows應(yīng)用程序使用的界面是由各種圖形元素組成的圖形界面(GUI) 應(yīng)用程序的用戶主要是通過鍵盤和鼠標(biāo)對應(yīng)用程序界面上的圖形元素進(jìn)行操作來與Windows應(yīng)用程序進(jìn)行交互的,2020/7/28,C+實踐課,3,1. 概述,使用VC+創(chuàng)建交互式Windows應(yīng)用程序 使用Windows API 開發(fā)應(yīng)用程序 Windows API是Windows操作
2、系統(tǒng)提供給應(yīng)用程序的編程接口 自始至終地編寫代碼,構(gòu)成應(yīng)用程序GUI的所有元素都必須以編程方式創(chuàng)建 使用MFC 開發(fā)應(yīng)用程序 MFC:一組封裝了Windows API的C+類 在GUI構(gòu)建方面得到一些幫助,在對話框窗體上以圖形方式組合控件,只需要對程序與用戶之間的交互進(jìn)行編程,2020/7/28,C+實踐課,4,1. 概述,創(chuàng)建一個簡單的Windows API 應(yīng)用程序 有助于理解Windows 應(yīng)用程序的后臺工作原理 有助于我們使用Visual C+提供的更高級的功能開發(fā)應(yīng)用程序,2020/7/28,C+實踐課,5,2. Windows編程基礎(chǔ),內(nèi)容 2.1 窗口與句柄 2.2 Window
3、s程序與操作系統(tǒng) 2.3 事件驅(qū)動程序 2.4 Windows消息 2.5 Windows API 2.6 Windows 數(shù)據(jù)類型 2.7 Windows程序中的符號,2020/7/28,C+實踐課,6,2.1 窗口與句柄,窗口功能 系統(tǒng)對應(yīng)用程序管理的基本單位 應(yīng)用程序與用戶之間交互的接口環(huán)境 Window應(yīng)用程序基本的操作單元 Windows應(yīng)用程序編程 創(chuàng)建一個或多個窗口 Windows應(yīng)用程序運行 窗口內(nèi)部、窗口與窗口之間、窗口與系統(tǒng)之間進(jìn)行數(shù)據(jù)處理與交換的過程,2020/7/28,C+實踐課,7,2.1 窗口與句柄,窗口 Windows程序界面的主要組成 典型窗口及其構(gòu)成,2020
4、/7/28,C+實踐課,8,工具欄,標(biāo)題欄,菜單欄,2.1 窗口與句柄,典型的窗口最基本的組成部分: 邊框 限定了窗口的邊界,可以是固定的或可調(diào)的 標(biāo)題欄文本(顯示窗口的名稱) 標(biāo)題欄圖標(biāo)(位于標(biāo)題欄左端) 工作區(qū)(客戶區(qū)) 窗口中心未被標(biāo)題欄或邊框使用的區(qū)域) 可選組件 菜單欄、工具欄等 菜單、對話框、工具欄的圖標(biāo)、光標(biāo)等,都是由資源文件定義的,2020/7/28,C+實踐課,9,2.1 窗口與句柄,在Windows應(yīng)用程序中,窗口是通過窗口句柄(HWND)來標(biāo)識的 在Windows程序中有各種各樣的對象(資源),例如:窗口、圖標(biāo)、光標(biāo)等 Windows把為這種復(fù)雜對象所定義的標(biāo)識叫做句柄(
5、HANDLE),應(yīng)用程序通過句柄訪問相應(yīng)的對象信息 句柄是一個長度為4字節(jié)的整數(shù)值,2020/7/28,C+實踐課,10,2.1 窗口與句柄,句柄實際上是Windows在內(nèi)存中維護(hù)的一個對象內(nèi)存物理地址列表的整數(shù)索引,而不是對象的地址指針 程序?qū)⑿枰L問對象的句柄傳遞給系統(tǒng),系統(tǒng)根據(jù)句柄檢索對象列表從而獲得對象及其物理地址。,2020/7/28,C+實踐課,11,2.1 窗口與句柄,2020/7/28,C+實踐課,12,常用句柄類型 HWND窗口句柄 HINSTANCE當(dāng)前實例句柄 HCURSOR光標(biāo)句柄 HFONT字體句柄 HPEN畫筆句柄 HBRUSH畫刷句柄 HDC設(shè)備環(huán)境句柄 HICO
6、N圖標(biāo)句柄 HMENU菜單句柄 HFILE文件句柄,句柄所標(biāo)識對象實例 窗口 按鈕 圖標(biāo) 滾動條 輸出設(shè)備 控件 文件 程序進(jìn)程 等等.,2.2 Windows程序與操作系統(tǒng),使用Windows 程序時,主要是與Windows 交互,然后由Windows 與應(yīng)用程序通信 我們編寫的Windows程序是在Windows操作系統(tǒng)的控制下運行的,它們不能直接處理硬件,與外部的所有通信都必須通過Windows進(jìn)行。,2020/7/28,C+實踐課,13,2.3 事件驅(qū)動程序,傳統(tǒng)過程化程序 只有單一執(zhí)行順序 過程化程序的輸入是由程序代碼控制的 而且只能發(fā)生在程序允許它發(fā)生的時候,2020/7/28,C
7、+實踐課,14,2.3 事件驅(qū)動程序,Windows程序是事件驅(qū)動的 Windows應(yīng)用程序無法預(yù)知將要發(fā)生的是什么類型的輸入 用戶動作首先被操作系統(tǒng)接收到,被Windows認(rèn)為是事件 用戶界面發(fā)生的事件通常將導(dǎo)致執(zhí)行一段特定程序代碼 程序的執(zhí)行過程是由用戶的動作序列決定的,以這種方式工作的程序為事件驅(qū)動程序,2020/7/28,C+實踐課,15,2.3 事件驅(qū)動程序,事件由用戶動作或Windows本身引起的 事件通常以以下三種方式產(chǎn)生: 通過輸入設(shè)備,如鍵盤和鼠標(biāo); 通過屏幕上可視的對象,如菜單、工具欄按鈕、滾動條和對話框上的控件; 來自Windows內(nèi)部,如當(dāng)一個后面的窗口顯示到前面來時。
8、 Windows應(yīng)用程序主要由響應(yīng)事件的代碼段組成,2020/7/28,C+實踐課,16,事件驅(qū)動程序的結(jié)構(gòu)示意圖,2020/7/28,C+實踐課,17,2.4 Windows消息及消息隊列,操作系統(tǒng)是怎樣將感知到的事件傳遞給應(yīng)用程序的呢? 通過消息機(jī)制(Message)來實現(xiàn)的 Windows操作系統(tǒng)將每個事件記錄在一條消息中; 將該消息放入目標(biāo)程序的消息隊列中 Windows消息只不過是與某個事件有關(guān)的數(shù)據(jù)記錄,而某個應(yīng)用程序的消息隊列只不過是等待該應(yīng)用程序處理的消息序列。,2020/7/28,C+實踐課,18,2.4 Windows消息及消息隊列,MSG結(jié)構(gòu)體,2020/7/28,C+實
9、踐課,19,typedef struct tagMSG HWND hwnd; /窗口句柄 UINT message;/消息號,用于區(qū)別其他消息的常量值 WPARAM wParam; /消息的附加信息 LPARAM lParam; /消息的附加信息 DWORD time; /消息創(chuàng)建的時間 POINT pt; /消息創(chuàng)建時的屏幕光標(biāo)位置 MSG;,2.4 Windows消息及消息隊列,常見的Windows消息,2020/7/28,C+實踐課,20,Windows程序必須包含專門處理這些消息的函數(shù) 該函數(shù)經(jīng)常被稱作WndProc()或WindowProc() 窗口過程函數(shù) 不過該函數(shù)不必?fù)碛刑囟ǖ?/p>
10、名稱,因為Windows是通過我們提供的函數(shù)指針訪問該函數(shù)的。,2020/7/28,C+實踐課,21,2.4 Windows消息及消息隊列,給程序發(fā)送消息歸結(jié)為Windows調(diào)用我們提供的通常名為WindowProc()的函數(shù) 借助于給該函數(shù)傳遞的實參給程序傳遞任何必要的數(shù)據(jù)。 在相應(yīng)的WindowProc()函數(shù)內(nèi),編程人員應(yīng)當(dāng)負(fù)責(zé)根據(jù)提供的數(shù)據(jù),確定消息的意義以及該采取的動作,只需處理必要消息。 通過調(diào)用Windows提供的標(biāo)準(zhǔn)函數(shù)DefWindowProc(),處理默認(rèn)的消息處理功能。,2020/7/28,C+實踐課,22,2.4 Windows消息及消息隊列,2.5 Windows A
11、PI,Windows把它所能夠完成的功能以函數(shù)的形式提供給應(yīng)用程序使用,這些函數(shù)的集合就是Windows操作系統(tǒng)提供給應(yīng)用程序編程的接口(Application Programming Interface),簡稱Windows API 如CreateWindow就是一個API函數(shù),應(yīng)用程序中調(diào)用這個函數(shù),操作系統(tǒng)就會按照該函數(shù)提供的參數(shù)信息產(chǎn)生一個相應(yīng)的窗口。,2020/7/28,C+實踐課,23,2.5 Windows API,任何Windows應(yīng)用程序與Windows本身之間的所有通信,都要使用Windows API 根據(jù)Windows API函數(shù)的功能,可以將其分為三類: 管理函數(shù):實現(xiàn)
12、窗口和其它對象的創(chuàng)建、移動和修改等功能。 圖形設(shè)備函數(shù):實現(xiàn)與設(shè)備無關(guān)的圖形操作功能,可以實現(xiàn)圖形繪制。 系統(tǒng)服務(wù)函數(shù):實現(xiàn)與操作系統(tǒng)有關(guān)的多種功能,如進(jìn)程線程管理、任務(wù)調(diào)度等。,2020/7/28,C+實踐課,24,2.6 Windows 數(shù)據(jù)類型,Windows定義的用在Windows API中指定函數(shù)的形參類型和返回類型的數(shù)據(jù)類型,包含在windows.h頭文件中。,2020/7/28,C+實踐課,25,2.6 Windows程序中的符號,在Windows程序中,變量名的前綴都能夠指出該變量容納的數(shù)值類型以及該變量的用法。,2020/7/28,C+實踐課,26,3.Windows程序結(jié)構(gòu)
13、,內(nèi)容 3.1 概述 3.2 WinMain()函數(shù) 3.3 窗口過程函數(shù) 3.4簡單的Windows程序,2020/7/28,C+實踐課,27,3.Windows程序結(jié)構(gòu),3.1 概述 最簡單的僅使用Windows API的Windows程序,需要編寫兩個函數(shù) WinMain(),程序執(zhí)行入口,完成基本初始化工作; WindowProc(),由Windows調(diào)用,處理應(yīng)用程序的消息,程序?qū)S么a所在函數(shù)。 這兩個函數(shù)構(gòu)成了完整的程序,但相互之間無直接聯(lián)系,都由Windows調(diào)用,如下圖所示。,2020/7/28,C+實踐課,28,3.Windows程序結(jié)構(gòu),2020/7/28,C+實踐課,2
14、9,3.2 WinMain()函數(shù),WinMain()函數(shù)等價于控制臺程序中的main()函數(shù); 該函數(shù)是執(zhí)行開始的地方 為程序其余部分執(zhí)行基本初始化工作的地方。 為了允許Windows 傳遞數(shù)據(jù),WinMain()函數(shù)有4 個形參和一個int 類型的返回值 當(dāng)WinMain函數(shù)結(jié)束或返回時,Windows應(yīng)用程序結(jié)束,2020/7/28,C+實踐課,30,3.2 WinMain()函數(shù),原型 int WINAPI WinMain( HINSTANCE hInstance, / handle to current instance HINSTANCE hPrevInstance, / hand
15、le to previous instance LPSTR lpCmdLine, / command line int nCmdShow / show state ); WINAPI是Windows定義的說明符,將使系統(tǒng)以某種特殊的方式處理函數(shù)名和實參;該說明符放在由Windows調(diào)用的函數(shù)名前面。 WinMain函數(shù)接收4個參數(shù),這些參數(shù)都是在系統(tǒng)調(diào)用WinMain函數(shù)時傳遞給應(yīng)用程序的,2020/7/28,C+實踐課,31,3.2 WinMain()函數(shù),WinMain()函數(shù)的參數(shù) HINSTANCE hInstance, 表示該程序當(dāng)前運行的程序?qū)嵗浔?HINSTANCE hPre
16、vInstance, 該參數(shù)可以置為NULL; LPSTR lpCmdLine, 指向啟動程序的命令行字符串的指針; int nCmdShow, 決定創(chuàng)建窗口的外觀;,2020/7/28,C+實踐課,32,3.2 WinMain()函數(shù),Windows程序中的WinMain()函數(shù)需要完成 窗口的創(chuàng)建 消息循環(huán),2020/7/28,C+實踐課,33,3.2 WinMain()函數(shù),設(shè)計窗口類 創(chuàng)建窗口的第一步是定義希望創(chuàng)建的窗口的種類 Windows定義了結(jié)構(gòu)類型WNDCLASSEX來指定窗口數(shù)據(jù),2020/7/28,C+實踐課,34,WNDCLASS wndcls; wndcls.cbCls
17、Extra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WinMyProc; wndcls.lpszClassName=“MyWnd; wndcls.lpszMenuName=NULL; wndcls.style=CS_H
18、REDRAW | CS_VREDRAW;,2020/7/28,C+實踐課,35,3.2 WinMain()函數(shù),注冊窗口類 RegisterClass( 創(chuàng)建窗口,2020/7/28,C+實踐課,36,3.2 WinMain()函數(shù),3.2 WinMain()函數(shù),創(chuàng)建窗口 HWND hwnd; hwnd=CreateWindow(MyWnd,MyWindow,WS_OVERLAPPEDWINDOW, 0,0,600,400,NULL,NULL,hInstance,NULL);,2020/7/28,C+實踐課,37,3.2 WinMain()函數(shù),顯示及更新窗口 調(diào)用ShowWindow函數(shù)后
19、,窗口顯示在屏幕上 ShowWindow(hwnd,SW_SHOWNORMAL);,2020/7/28,C+實踐課,38,3.2 WinMain()函數(shù),顯示及更新窗口 調(diào)用UpdateWindow函數(shù),刷新窗口 UpdateWindow(hwnd); UpdateWindow函數(shù)將發(fā)送一個WM_PAINT消息來刷新窗口,2020/7/28,C+實踐課,39,3.2 WinMain()函數(shù),消息循環(huán) 不斷地從消息隊列中取出消息,并進(jìn)行響應(yīng) 調(diào)用GetMessage函數(shù)從消息隊列中取出消息 該函數(shù)接收到除WM_QUIT外的消息,均返回非零值,2020/7/28,C+實踐課,40,3.2 WinM
20、ain()函數(shù),消息循環(huán) 通常編寫的消息循環(huán)代碼如下: MSG msg; while(GetMessage( TranslateMessage函數(shù)將虛擬鍵消息轉(zhuǎn)換為字符消息 DispatchMessage函數(shù)分派一個消息到窗口過程函數(shù),實際上是將消息回傳給操作系統(tǒng),由操作系統(tǒng)調(diào)用窗口過程函數(shù)對消息進(jìn)行處理(響應(yīng)),2020/7/28,C+實踐課,41,3.2 WinMain()函數(shù),消息處理機(jī)制,2020/7/28,C+實踐課,42,3.3 窗口過程函數(shù),WinMain()函數(shù)負(fù)責(zé)窗口的通用外觀。 編寫一個窗口過程函數(shù),用于處理發(fā)送給窗口的消息處理 Windows應(yīng)用程序的主要代碼部分就集中在
21、窗口過程函數(shù)中,2020/7/28,C+實踐課,43,3.3 窗口過程函數(shù),CALLBACK回調(diào)函數(shù) 回調(diào)函數(shù)不是由函數(shù)實現(xiàn)方直接調(diào)用,而是在特定條件發(fā)生時由另外一方調(diào)用,用于對該條件進(jìn)行響應(yīng) 窗口過程函數(shù)被調(diào)用的過程,2020/7/28,C+實踐課,44,在窗口過程函數(shù)內(nèi)部使用switch/case語句來確定窗口過程接收的是什么消息,以及如何對這個消息進(jìn)行處理 LRESULT CALLBACK WinMyProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first mess
22、age parameter LPARAM lParam / second message parameter ),2020/7/28,C+實踐課,45,3.3 窗口過程函數(shù),WinMyProc()函數(shù), switch(uMsg) case WM_CHAR: char szChar20; sprintf(szChar,char is %d,wParam); MessageBox(hwnd,szChar,”Message,0); break;,2020/7/28,C+實踐課,46,WinMyProc()函數(shù),case WM_LBUTTONDOWN: MessageBox(hwnd,mouse cl
23、icked, “Message,0); HDC hdc; hdc=GetDC(hwnd); TextOut(hdc,0,50,”Windows API編程” ,strlen( Windows API編程); ReleaseDC(hwnd,hdc); break;,2020/7/28,C+實踐課,47,WinMyProc()函數(shù),case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC=BeginPaint(hwnd,2020/7/28,C+實踐課,48,WinMyProc()函數(shù),case WM_CLOSE: if(IDYES=MessageBox(hwnd,”是
24、否真的結(jié)束?”,”Message,MB_YESNO) DestroyWindow(hwnd); break;,2020/7/28,C+實踐課,49,WinMyProc()函數(shù),case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); return 0; ,2020/7/28,C+實踐課,50,3.3 窗口過程函數(shù),基于message值,使用switch語句。 每一種情況對應(yīng)一個特定的消息ID值,并對此進(jìn)行適當(dāng)?shù)奶幚恚?程序不想單獨處理的任何消息都有def
25、ault語句處理,默認(rèn)情況調(diào)用DefWindowProc()函數(shù),將消息回傳給Windows; DefWindowProc()是提供默認(rèn)消息處理機(jī)制的Windows API 函數(shù),2020/7/28,C+實踐課,51,繪制窗口客戶區(qū),Windows通過給程序發(fā)送WM_PAINT消息,告訴程序應(yīng)該重畫客戶區(qū)。 在向應(yīng)用程序窗口寫入內(nèi)容之前,需要告訴Windows我們想這樣做,還需要得到Windows的授權(quán)才能繼續(xù);調(diào)用Windows API函數(shù)BeginPaint()來做此事,該函數(shù)只應(yīng)該在響應(yīng)WM_PAINT消息時才被調(diào)用。 HDC hDC; / Device context handle PAINTSTRUCT PaintSt; / Structure defining area to be drawn hDC = BeginPaint(hWnd, / Prepare to draw the window,2020/7/28,C+實踐課,52,繪制窗口客戶區(qū),HDC hDC; / Device context handle HDC類型定義顯示設(shè)備上下文-通常稱為設(shè)備上下文 設(shè)備上下文 設(shè)備上下文在于設(shè)備無關(guān)的Windows API函數(shù)(向屏幕或打印機(jī)輸出信息)和
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高職院校內(nèi)部督導(dǎo)體系建設(shè)中的師生互動與溝通機(jī)制
- 電動交通與綠色能源轉(zhuǎn)型的融合發(fā)展路徑
- 創(chuàng)新性融資方式對非遺傳承的推動作用
- 廣東省寶塔實驗2025屆八上物理期末質(zhì)量檢測試題含解析
- 云南省蒙自市2024-2025學(xué)年八年級物理第一學(xué)期期末達(dá)標(biāo)檢測模擬試題含解析
- 九江市重點中學(xué)2025屆數(shù)學(xué)七上期末聯(lián)考模擬試題含解析
- 餐飲店轉(zhuǎn)讓及員工激勵機(jī)制合同范本
- 中國鐵路運輸行業(yè)噪聲控制標(biāo)準(zhǔn)化建設(shè)實踐經(jīng)驗分享
- 電信行業(yè)服務(wù)質(zhì)量提升策略研究
- 中國信息通信研究院-算力中心服務(wù)商分析報告(2025年)
- 眼科醫(yī)院感染制度與規(guī)程
- 透析病人營養(yǎng)不良的護(hù)理
- 充電樁項目實施過程中的質(zhì)量保證措施
- T-CPUMT 025-2024 工業(yè)互聯(lián)網(wǎng)平臺 服務(wù)通.用要求
- 2025年度地質(zhì)勘探監(jiān)理服務(wù)合同范本
- 保山隆陽區(qū)小升初數(shù)學(xué)試卷
- 2025年上半年北京市西城區(qū)教委事業(yè)單位公開招聘考試筆試易考易錯模擬試題(共500題)試卷后附參考答案
- RoHS知識培訓(xùn)課件
- 2024-2025學(xué)年北京西城區(qū)高一(上)期末語文試卷(含答案)
- 2025年貴州貴旅集團(tuán)雷山文化旅游產(chǎn)業(yè)發(fā)展有限責(zé)任公司招聘筆試參考題庫附帶答案詳解
- 2024年初升高數(shù)學(xué)銜接教材講義
評論
0/150
提交評論