Windows編程教案_第1頁(yè)
Windows編程教案_第2頁(yè)
Windows編程教案_第3頁(yè)
Windows編程教案_第4頁(yè)
Windows編程教案_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Windows編程教案第一課 最簡(jiǎn)單的Windows程序(2學(xué)時(shí))Windows編程是一個(gè)很大的主題,涉及的方面也非常的多。Windows始于90年代,至今Windows編程的發(fā)展已經(jīng)非常成熟了,而單獨(dú)直接使用API的開(kāi)發(fā)也是越來(lái)越少了。因此,市面上很少有泛泛的簡(jiǎn)單入門級(jí)的Windows程序設(shè)計(jì)了。一個(gè)是系統(tǒng)級(jí)的Windows編程介紹,如Windows核心編程。一個(gè)是方向級(jí)的Windows編程介紹如Windows圖形編程,Windows網(wǎng)絡(luò)編程等等。我們這次課的主要參考用書(shū)是Windows核心編程,同時(shí)也參考了一些其他內(nèi)容。鑒于教材的價(jià)格較貴,同時(shí)也需要考慮我們自身的學(xué)習(xí)內(nèi)容不一定很多以及學(xué)時(shí)

2、的原因,就沒(méi)有定教材??次业慕贪赴?。(1) Win32 APIAPI : Application Program Interface。應(yīng)用程序接口。API就是在進(jìn)行Windows編程時(shí)使用的函數(shù)庫(kù)。本課就是Windows編程=API+C語(yǔ)言(或者C+語(yǔ)言)(2) 開(kāi)發(fā)環(huán)境我校機(jī)器上安裝了VC+ 6.0。相信這是大家一直以來(lái)學(xué)習(xí)C,C+使用的開(kāi)發(fā)環(huán)境。但VC60離我們實(shí)在太遠(yuǎn)了,它是一款90年代的產(chǎn)品,已經(jīng)近20年的歷史了。我們機(jī)器里還有VS2005 或 VS2008,那里面的C環(huán)境要比VC60強(qiáng)太多了,強(qiáng)烈建議大家使用更高級(jí)的平臺(tái)。本次授課的開(kāi)發(fā)環(huán)境有兩個(gè)。一個(gè)是輕量級(jí)的DEV C+,一個(gè)是重

3、量級(jí)的VS2010.簡(jiǎn)單程序我們都將用DEV C+來(lái)實(shí)現(xiàn)。DEV C+是一個(gè)非常小的C環(huán)境,但性能要優(yōu)于VC60,調(diào)試環(huán)境不如VC60。這個(gè)環(huán)境在我們的共享資源里有,大家可以下載安裝。安裝過(guò)程非常簡(jiǎn)單,一直下一步即可。這是其主界面。(3) 最簡(jiǎn)單的Windows程序提到最簡(jiǎn)單的程序,幾乎所有的人都會(huì)想起經(jīng)典的HelloWorld。這不是Windows程序,如果在以前這叫DOS程序,現(xiàn)在叫Windows控制臺(tái)應(yīng)用程序。它不算Windows程序,但它很簡(jiǎn)單的就把Helloword顯示到屏幕上了。而Windows程序要想把HelloWorld顯示在屏幕上就確實(shí)不容易了。3.1 訪問(wèn)Helloworl

4、d網(wǎng)站,因?yàn)榘袶elloworld顯示在屏幕上并不容易,我們可以一點(diǎn)一點(diǎn)來(lái),先讓Helloworld以文字形式出現(xiàn)在其他地方,這里我們通過(guò)訪問(wèn)網(wǎng)站。把helloworld展現(xiàn)在網(wǎng)頁(yè)瀏覽器的地址欄上。真有這個(gè)網(wǎng)站嗎?唉,貌似還真有。運(yùn)行程序,打開(kāi)瀏覽器并訪問(wèn)網(wǎng)站。這是Windows程序。Windows程序和我們以前的程序有什么不同呢?l Windows程序不能使用scanf,printf,cin,cout。所以輸出helloworld變得沒(méi)有以前容易了。l windows程序一定要#include <windows.h>l windows程序的主函數(shù)不是main,是WinMain。注

5、意區(qū)分大小寫(xiě)。l 主函數(shù)的參數(shù)不一樣了int main(int argc ,char * argv)int WinMain(HINSTANCE hInstance, HINSTANCE,LPSTR lpStr,int nShow)絕大多數(shù)的人,初次接觸Windows編程都會(huì)被其冗長(zhǎng)的名字所折服,啊,沒(méi)辦法,這就是Windows的命名規(guī)格,叫匈牙利命令法,是微軟的一個(gè)匈牙利籍的程序員發(fā)明的,它的作用的能夠讓變量,類型名能夠真實(shí)的反應(yīng)其代表的意義,這對(duì)英語(yǔ)人士自然很好。對(duì)英語(yǔ)不好的接受起來(lái)就有點(diǎn)難了。詳細(xì)解釋一下WinMain是Windows編程的主函數(shù)。一定注意大小寫(xiě)啊。HINSTANCE,用W

6、indows的說(shuō)法叫句柄數(shù)據(jù)類型。但它并不是一個(gè)新的數(shù)據(jù)類型,它是通過(guò)#define定義出來(lái)的。#define DECLARE_HANDLE(name) struct name#_int unused; typedef struct name#_ *nameDECLARE_HANDLE(HINSTANCE);上面兩行是windef.h中對(duì)HINSTANCE的定義。說(shuō)到底HINSTANCE就是一個(gè)指針類型。LPSTR 是 typedef char * LPSTR。Windows編程里有大量通過(guò)#define和typedef定義出來(lái)的數(shù)據(jù)類型名。本質(zhì)上它們都不是新的東西,都是以前我們?cè)贑語(yǔ)言學(xué)過(guò)的

7、哪些數(shù)據(jù)類型另起了一個(gè)名字。為什么要這么做呢?一般Windows 程序比較大,好的命名利于維護(hù)和避免錯(cuò)誤??傊?,說(shuō)到底,舊壺裝新酒,貌似多了很多數(shù)據(jù)類型,不要被它們嚇到,它們就是比C語(yǔ)言你們學(xué)過(guò)的東西多穿了件馬甲。第二課 在窗口中顯示HelloWorld中(4學(xué)時(shí))1、 第一課的HelloWorld出現(xiàn)在網(wǎng)頁(yè)上。這不是我們的目的,我們要生成正常一點(diǎn)的HelloWorld。Windows程序中要顯示HelloWorld看來(lái)還不是太容易。(1) 將HelloWorld繪制到桌面補(bǔ)充說(shuō)明如果要讓這個(gè)程序順利執(zhí)行,需要寫(xiě)的內(nèi)容是lgdi32運(yùn)行的效果,helloworld顯示在桌面上了看到HelloW

8、orld了嗎。說(shuō)明l WinMain是Window的主函數(shù)l HDC 是個(gè)什么呢,本質(zhì)上是個(gè)指針,但是我們不需要了解它指向了什么,因此,簡(jiǎn)而化之HDC是一個(gè)32位的無(wú)符號(hào)整數(shù)。HDC叫設(shè)備上下文句柄。設(shè)備上下文指顯示器屏幕或打印機(jī)什么的。句柄有點(diǎn)類似文件句柄的意思,有了它才能操作設(shè)備。在這里有了它才能向設(shè)備上繪制。所有涉及繪圖的地方都涉及HDC。GetDC(窗口句柄)。如果使用GetDC(NULL)得到桌面的設(shè)備上下文。否則可以得到一個(gè)窗口的設(shè)備上下文,我們可以在窗口上進(jìn)行繪制。(2) LPTSTR 是 TCHAR * 的另一個(gè)寫(xiě)法(3) TextOut是Windows API的一個(gè)函數(shù),功能

9、是將文本寫(xiě)到設(shè)備上下文上。 TextOut(HDC,橫坐標(biāo),縱坐標(biāo),字符串,字符串長(zhǎng)度)(4) ReleaseDC(窗口句柄,HDC)釋放設(shè)備上下文 GetDC的得到的HDC一定要用ReleaseDC釋放,否則機(jī)器容易資源耗盡。2、 在一個(gè)獨(dú)立窗口中顯示HelloWorld,這是重點(diǎn)了,涉及一些Windows編程重要的內(nèi)容分如下幾個(gè)步驟(1) 定義一個(gè)全局函數(shù)(2) 定義WinMain函數(shù)(3) 在WinMain函數(shù)內(nèi)注冊(cè)窗口類lpszClassName:自己取個(gè)名字,字母lpfnWndProc:函數(shù)指針,為我們?cè)诘谝徊蕉x的函數(shù)名。用強(qiáng)制類型轉(zhuǎn)換在Windows中顯示一個(gè)窗口,一定要先注冊(cè)窗

10、口類。函數(shù)式RegisterClassEx(&wc)(4) 創(chuàng)建并顯示窗口(5) 建立消息循環(huán)(6) 補(bǔ)充處理WM_PAINT,補(bǔ)充WndProc函數(shù)總結(jié):創(chuàng)建窗口的模式是基本是固定的,本課的代碼很大一部分就是這么寫(xiě)。主要在WndProc內(nèi)存在不同。涉及的API函數(shù)RegisterClassEx(&WNDCLASSEX)WinMain(HINSTACNE,HINSTANCE,LPSTR,int nShow)DefWindowProc(HWND,UINT,WPARAM,LPARAM)GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterM

11、in,UINT wMsgFilterMax).如果得到WM_QUIT返回0TranslateMessage(&MSG)DispathMessage(&MSG)BeginPaint(&PAINTSTRUCT)TextOut(HDC,INT,INT,LPSTR,INT)EndPaint(HWND,&PAINTSTRUCT)作業(yè):自己建立應(yīng)用,在窗口100,100位置顯示HelloWorld第三課 坐標(biāo)位置及大?。?學(xué)時(shí))在我們寫(xiě)控制臺(tái)應(yīng)用的時(shí)候,不能自由的控制輸出顯示的位置。因此,沒(méi)有學(xué)習(xí)過(guò)這方面的內(nèi)容,現(xiàn)在我們創(chuàng)建了窗口,并且在窗口上顯示了Hello World。

12、這個(gè)過(guò)程涉及到很多涉及位置和大小的因素,如窗口的大小,顯示的位置,文字顯示的位置。說(shuō)到位置,就涉及定位,說(shuō)到定位就要說(shuō)坐標(biāo)系。在屏幕上顯示內(nèi)容涉及到坐標(biāo)空間的知識(shí)。在Windows應(yīng)用中坐標(biāo)空間分如下幾部分內(nèi)容1、 物理坐標(biāo)空間物理坐標(biāo)空間,指的是物理設(shè)備上對(duì)應(yīng)的坐標(biāo)系。如顯示器坐標(biāo)原點(diǎn)在左上角。如下是一個(gè)1024*768的屏幕物理坐標(biāo)(0,0)(1024,0)(0,768)2、 設(shè)備坐標(biāo)空間基于設(shè)備上下文指定的坐標(biāo)空間。如窗口內(nèi)顯示的文本,使用的坐標(biāo)就是基于窗口內(nèi)上下文的坐標(biāo)。可以看到設(shè)備空間是物理空間體系的一個(gè)子空間。設(shè)備空間可以依賴于一個(gè)窗口。換句話可以把設(shè)備空間理解為在物理空間上顯示的

13、一個(gè)對(duì)象,其子空間。下面我們通過(guò)一個(gè)小例子理解物理空間和設(shè)備空間在窗口的標(biāo)題條,以設(shè)備坐標(biāo),和物理坐標(biāo)的形式顯示鼠標(biāo)在窗口內(nèi)的位置WndProc處理消息循環(huán)WM_MOUSEMOVE,鼠標(biāo)移動(dòng)時(shí)消息標(biāo)識(shí),是個(gè)整數(shù)。其參數(shù)lParam,的第16位代表設(shè)備坐標(biāo)中的X,高16位代表設(shè)備坐標(biāo)的Y。POINT 是結(jié)構(gòu)體。只有x,y兩個(gè)成員ClientToScreen,將設(shè)備坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)(物理坐標(biāo))sprintf:格式化字符串SetWindowText:設(shè)Window標(biāo)題3、 頁(yè)面坐標(biāo)空間(邏輯坐標(biāo)空間的一種)作用,可以任意指定坐標(biāo)原點(diǎn),坐標(biāo)軸方向,比例尺等信息??梢杂脕?lái)與設(shè)備無(wú)關(guān)的大小如厘米,毫米等

14、。頁(yè)面坐標(biāo)叫窗口,其表示有原點(diǎn)(X,Y),寬度,高度組成(WIDTH,HEIGHT)設(shè)備坐標(biāo)叫視口,其表示有原點(diǎn)(x,y),寬度,高度組成(width,height)頁(yè)面坐標(biāo)和設(shè)備坐標(biāo)的變換關(guān)系,大寫(xiě)為設(shè)備坐標(biāo),小寫(xiě)為頁(yè)面坐標(biāo)PX=X+(px-x)*WIDTH/widthPY=Y+(py-y)*HEIGHT/heightpx=x+(PX-X)*width/WIDTHpy=y+(PY-Y)*heigh/HEIGHTGDI函數(shù)使用頁(yè)面坐標(biāo),顯示出來(lái)時(shí)是設(shè)備坐標(biāo)通過(guò)對(duì)窗口,是否對(duì)應(yīng)的四個(gè)參數(shù)的設(shè)置,可以實(shí)現(xiàn)特殊的變換。頁(yè)面坐標(biāo)是邏輯坐標(biāo)的一種。在這個(gè)例子中我們一直使用MoveToEx(ps.hdc,

15、0,0,NULL); LineTo(ps.hdc,30,30);劃線,MoveToEx是把畫(huà)筆移動(dòng)到指定位置(頁(yè)面坐標(biāo)),LineTo是從畫(huà)筆所在位置到目標(biāo)位置畫(huà)一條線。在這個(gè)例子中,每次劃線前通過(guò)設(shè)置視口,窗口結(jié)果使劃線的結(jié)果不同。這種形式的坐標(biāo)轉(zhuǎn)換無(wú)法實(shí)現(xiàn)旋轉(zhuǎn)4、 世界坐標(biāo)空間(邏輯坐標(biāo)空間的另一種)功能:比頁(yè)面坐標(biāo)空間方便,可以實(shí)現(xiàn)旋轉(zhuǎn)結(jié)構(gòu)體XFORMFLOAT eM11,FLOAT eM12,FLOAT eM21,FLOAT eM21,FLOAT eDx,FLOAT eDy,世界坐標(biāo)到設(shè)備坐標(biāo)的變換。小寫(xiě)到大寫(xiě)。PX=eM11*px+eM21*py+eDx;PY=eM12*px+eM2

16、2*py+eDy;默認(rèn)為1,0,0,1,0,0 和設(shè)備坐標(biāo)相同1001dxdymx00my00縮放-100-100映像旋轉(zhuǎn)cos(a),sin(a),-sin(a),cos(a),0,0順時(shí)針旋轉(zhuǎn)a度cos(a),-sin(a),sin(a),cos(a),0,0逆時(shí)針旋轉(zhuǎn)a度我們下面的例子通過(guò)Rectangle(ps.hdc,0,0,50,50);繪制50*50的矩形,用循環(huán)配合世界坐標(biāo)變換繪制特殊的圖形 循環(huán)20次,每次旋轉(zhuǎn)坐標(biāo)軸的方向,繪制正方形??偨Y(jié):物理坐標(biāo)指的是屏幕坐標(biāo),不能改變坐標(biāo)軸設(shè)備坐標(biāo)指的是窗口坐標(biāo),不能改變坐標(biāo)軸頁(yè)面坐標(biāo)和世界坐標(biāo)均是邏輯坐標(biāo),可以改變坐標(biāo)軸,世界坐標(biāo)功能

17、更強(qiáng),可以旋轉(zhuǎn)。理解這些概念的繪圖是很重要的。相關(guān)函數(shù)BOOL ClientToScreen( HWND hWnd, LPPOINT lpPoint); 設(shè)備坐標(biāo)轉(zhuǎn)屏幕坐標(biāo)BOOL ScreenToClient( HWND hWnd, LPPOINT lpPoint);屏幕坐標(biāo)轉(zhuǎn)設(shè)備坐標(biāo)int MapWindowPoints( HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints); 各個(gè)窗口設(shè)備坐標(biāo)之間的轉(zhuǎn)換BOOL SetWindowOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint )

18、;設(shè)置窗口的原點(diǎn)SetViewportOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint);設(shè)置視口的原點(diǎn)BOOL SetViewportExtEx( HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize);設(shè)置視口的width,heightBOOL SetWindowExtEx( HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize );設(shè)置窗口的width,heightSetMapMode設(shè)置頁(yè)面坐標(biāo)的映射模式SetGraphicsMode設(shè)置世界坐標(biāo)的映

19、射模式Rectangle繪制矩形,并填充內(nèi)部SetWorldTransform設(shè)置世界坐標(biāo)變換LineTo:換線MoveToEx:移動(dòng)畫(huà)筆SetWindowText設(shè)置窗口標(biāo)題LPtoDP(hdc,LPPOINT,int)把邏輯坐標(biāo)點(diǎn)轉(zhuǎn)換為設(shè)備坐標(biāo)點(diǎn)作業(yè):使用movetoex,lineto,LPtoDP及世界坐標(biāo)變換,繪制正六邊形提示:畫(huà)一條水平線后,將坐標(biāo)原點(diǎn)移動(dòng)到線的末尾,并將坐標(biāo)軸旋轉(zhuǎn)60度*n,重復(fù)上步要將坐標(biāo)移動(dòng)到線尾需要使用LPtoDP第四課 色彩及繪制(6學(xué)時(shí))(1)畫(huà)點(diǎn)像素:計(jì)算機(jī)屏幕上的一個(gè)點(diǎn)。是計(jì)算機(jī)屏幕顯示的最小單位。點(diǎn)的個(gè)數(shù)取決于計(jì)算機(jī)的分辨率。如1024*768,則屏

20、幕由1024*768個(gè)點(diǎn)組成。每個(gè)點(diǎn)都可以獨(dú)立的顯示一個(gè)顏色。計(jì)算機(jī)能夠表示的顏色有256*256*256=16777216種。顏色的表示 COLORREF 。定義顏色RGBCOLORREF color=RGB(紅,綠,藍(lán))隨機(jī)繪制顏色點(diǎn)需要#include<cstdlib>srand:隨機(jī)種子函數(shù),傳遞的參數(shù)不同,可以生成不同的隨機(jī)數(shù)序列GetTickCount(): API函數(shù),得到系統(tǒng)開(kāi)機(jī)后到現(xiàn)在的滴答數(shù),特點(diǎn)就是每次返回的結(jié)果不重復(fù)。兩者的配合得到不重復(fù)的隨機(jī)數(shù)序列rand得到函數(shù)SetPixel設(shè)置某點(diǎn)的顏色(2) 畫(huà)線在以前的例子里我們一直用1個(gè)像素寬的黑色實(shí)現(xiàn)來(lái)畫(huà)線。

21、現(xiàn)在我們學(xué)習(xí)創(chuàng)建畫(huà)筆,用畫(huà)筆來(lái)畫(huà)線。步驟 1、創(chuàng)建畫(huà)筆CreatePen(畫(huà)筆類型,寬度,顏色) 2、將畫(huà)筆選入設(shè)備上下文SelectObject 3、用畫(huà)筆繪制 4、將畫(huà)筆選出設(shè)備 5、刪除創(chuàng)建的畫(huà)筆對(duì)象SelectObject是將GDI對(duì)象畫(huà)筆選入設(shè)備上下文,并將當(dāng)前的選出返回。因此我們兩次使用SelectObject,最后一個(gè)將以前的畫(huà)筆選入,返回我們創(chuàng)建的,并在下一步刪除畫(huà)筆。虛線只能支持寬度1.畫(huà)線函數(shù)Polygon(HDC,LPPOINT,INT).連接指定點(diǎn),畫(huà)多邊形,封閉。如果畫(huà)4邊形則確認(rèn)3個(gè)點(diǎn)即可。Polyline(HDC,LPPOINT,INT).連接指定點(diǎn),畫(huà)多邊,不封

22、閉MoveToEx:移動(dòng)畫(huà)筆LineTo:用當(dāng)前的畫(huà)筆劃線Arc:畫(huà)圓弧 BOOL Arc( HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc );前4個(gè)是畫(huà)圓弧的矩形,后四個(gè)指定了弧開(kāi)始和結(jié)束的位置作業(yè):畫(huà)一條正弦曲線使用SexPixel,LineTo,MoveToEx實(shí)現(xiàn)(3) 畫(huà)面畫(huà)面就是用畫(huà)刷來(lái)填充步驟 1、創(chuàng)建畫(huà)刷CreateSolidBrush(顏色) 2、將畫(huà)刷選入設(shè)備上下

23、文SelectObject 3、用畫(huà)刷填充 4、將畫(huà)刷選出設(shè)備 5、刪除創(chuàng)建的畫(huà)刷對(duì)象用藍(lán)色畫(huà)刷填充矩形,矩形的邊框是黑色。CreateSolidBrush:創(chuàng)建顏色畫(huà)刷Rectangle:繪制矩形,用當(dāng)前的Pen繪制邊框,用當(dāng)前的Brush來(lái)填充矩形內(nèi)部FillRect:畫(huà)刷填充矩形。FillRect(hdc,&RECT,HBRUSH)使用FillRect不繪制邊框,因?yàn)閰?shù)中有畫(huà)筆,也不用SelectObject了。Ellipse:橢圓,圓。畫(huà)邊框,填充Pie:圓餅(4) 位圖將文件系統(tǒng)中的位圖顯示到窗口中。繪制位圖步驟1、 根據(jù)現(xiàn)有的設(shè)備上下文創(chuàng)建兼容的設(shè)備上下文2、 加載位圖3

24、、 繪制圖像4、 刪除加載的位圖5、 刪除兼容的設(shè)備上下文BitBlt是在設(shè)備上下文之間拷貝圖像的函數(shù),非常常用在上一個(gè)列子的基礎(chǔ)上,得到位圖的大小并繪制實(shí)際大小的位圖作業(yè):在一個(gè)窗口上顯示一副位圖文件(*.bmp)。(5) 字體和文本創(chuàng)建邏輯字體并顯示文本步驟1、 創(chuàng)建邏輯字體2、 選入字體3、 輸出文本4、 選出字體5、 刪除字體另一個(gè)與文本繪制有關(guān)的功能更強(qiáng)的函數(shù)是DrawText總結(jié):本課介紹了一些基本的繪圖操作,其中涉及了較多的函數(shù),這里只是介紹了基本的使用方式和原理。函數(shù)srandrandGetClientRectSetPixelLineToMoveToExCreatePenCre

25、ateSolidBrushCreateFontIndirectBitBltSelectObjectDeleteObjectCreateCompatibleDCLoadImageRectangleFillRectDeleteDC等等。第五課 常用控件的使用(6學(xué)時(shí))在上面的幾節(jié)課程中我們學(xué)習(xí)了如何建立Windows 應(yīng)用,并在圖形環(huán)境下繪制圖形。這些操作都是控制臺(tái)應(yīng)用中沒(méi)有的。本章我們介紹如何在窗口中加入按鈕等常規(guī)控件,并且處理它們。一般控件種類,按鈕,列表組合,編輯,列表,滾動(dòng)條,靜態(tài)文本??丶且环N特殊的窗口。這些特殊窗口的類已經(jīng)由Windows系統(tǒng)注冊(cè)了,不需要我們注冊(cè)。這些類的名字分別為

26、。BUTTON,COMBOBOX,EDIT,LISTBOX,SCROLLBAR,STATIC(1) 創(chuàng)建任何時(shí)候均可,但通常在WM_CREATE事件中處理WM_CREATE是在窗口創(chuàng)建時(shí)觸發(fā)WM_DESTORY是在窗口銷毀時(shí)觸發(fā)控件用CreateWindow創(chuàng)建,返回控件窗體的句柄,窗體的類型一定為WS_CHILDWINDOW。附加的類型以或關(guān)系疊加。具體要參見(jiàn)MSDN(2) 操控控制這些控件是通過(guò)向這些控件的窗體句柄發(fā)送特點(diǎn)消息來(lái)實(shí)現(xiàn)的如 SendMessage(控件句柄,消息指,參數(shù)1,參數(shù)2)具體設(shè)置參見(jiàn)MSDN在上面的例子,我們處理下拉列表的時(shí)候使用了SendMessage發(fā)送消息(3

27、) 反饋我們操作控件會(huì)觸發(fā)控件的事件得到一些反饋,下面介紹如何得到這些反饋??傮w上,我們把這些反饋過(guò)程叫通知。通知的過(guò)程是將反饋發(fā)送給父窗體,一般父窗體有兩個(gè)事件接收控件的反饋WM_NOTIFY,WM_COMMAND。WM_COMMANDHIWORD(wParam)通知消息號(hào)LOWORD(wParam)控件標(biāo)識(shí)WM_NOTIFYwParam :控件標(biāo)識(shí)lParam:NHMDR的指針比如按鈕的單機(jī)對(duì)應(yīng)的事件是BN_CLICKED。該事件通過(guò)WM_COMMAND通知。我們把上個(gè)例子補(bǔ)充完整,并且為每個(gè)控件指定ID,指定的方式是在(HMENU)的后面寫(xiě)個(gè)整數(shù),原則上應(yīng)該不同。HIWORD,得到一個(gè)字

28、的高字節(jié)。LOWORD得到一個(gè)字的低字節(jié)。(4) 通用控件我們上面介紹的是基本的控件,除了這些基本控件外還有一些通用控件。這些控件的使用和處理和基本的控件差不多,但功能更強(qiáng)大。ANIMATE_CLASS : 動(dòng)畫(huà)控件,播放AVI動(dòng)畫(huà)DATETIMEPICK_CLASS :日期時(shí)間下拉控件HOTKEY_CLASS :定義熱鍵的控件MONTHCAL_CLASS : 月份選擇控件PROGRESS_CLASS :進(jìn)度條控件REBARCLASSNAME :rebar控件STATUSCLASSNAME:狀態(tài)條控件TOOLBARCLASSNAME :工具條TOOLTIPS_CLASS :提示控件TRACKB

29、AR_CLASS :軌跡條UPDOWN_CLASS :上下箭頭WC_COMBOBOXEX :組合框擴(kuò)展WC_HEADER :頭控件WC_IPADDRESS :IP地址控件WC_LISTVIEW :listview控件WC_PAGESCROLLER :頁(yè)滾動(dòng)控件WC_TABCONTROL :tabControl控件WC_TREEVIEW :樹(shù)視圖控件通用控件在使用前使用InitCommonControlsEx初始化。使用這些通用控件要include <commctrl.h>同時(shí)在連接時(shí)要連接 comctl32.dll頭部這些控件和IE有關(guān)系,根據(jù)IE版本不同,控件的外觀和功能有區(qū)別。

30、(5) 創(chuàng)建菜單CreateMenu:創(chuàng)建一個(gè)菜單CreatePopupMenu:創(chuàng)建一個(gè)子菜單AppendMenu:向菜單增加項(xiàng)目SetMenu:將菜單聯(lián)系到窗口第六課 進(jìn)程及線程(2學(xué)時(shí))l 進(jìn)程:是一個(gè)正在運(yùn)行的程序的實(shí)例。由兩個(gè)部分組成1、 一個(gè)是操作系統(tǒng)用來(lái)管理進(jìn)行的內(nèi)核對(duì)象。內(nèi)核對(duì)象是系統(tǒng)用來(lái)存放關(guān)于進(jìn)程信息的地方。2、 地址空間,每個(gè)進(jìn)行都有自己的地址空間進(jìn)程本身不執(zhí)行代碼,進(jìn)程要至少擁有一個(gè)線程,由線程來(lái)執(zhí)行代碼。每個(gè)線程都擁有自己的CPU寄存器和堆棧。當(dāng)創(chuàng)建一個(gè)進(jìn)程時(shí)系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)主線程。CreateProcess創(chuàng)建進(jìn)程 內(nèi)部執(zhí)行細(xì)節(jié):1 創(chuàng)建一個(gè)小的結(jié)構(gòu)存放進(jìn)程信息

31、2 分配地址空間 3 創(chuàng)建一個(gè)小的結(jié)構(gòu)存放線程信息 4 執(zhí)行C/C+啟動(dòng)代碼,最終會(huì)調(diào)用WinMain或main。結(jié)束一個(gè)進(jìn)程 TerminateProcessTerminateProcess1 使用ToolHelp遍歷系統(tǒng)進(jìn)程列舉系統(tǒng)全部的進(jìn)程需要#include <Tlhelp32.h>#include <string>using namespace std;l 線程線程由兩個(gè)部分組成1 內(nèi)核對(duì)象2 線程堆棧,用于維護(hù)執(zhí)行代碼時(shí)所有的函數(shù)參數(shù)和局部變量進(jìn)程是活波的,進(jìn)程不執(zhí)行任何東西,它是線程的容器。線程在進(jìn)程的地址空間中執(zhí)行代碼。如果一個(gè)進(jìn)程擁有多個(gè)線程則這些線程

32、共享進(jìn)程地址空間內(nèi)的代碼和數(shù)據(jù)。進(jìn)程的地址空間要比線程占用更多的系統(tǒng)資源,因此要更多的使用線程。每個(gè)線程必須有個(gè)入口點(diǎn)函數(shù),主線程是main,WinMain。如果要?jiǎng)?chuàng)建一個(gè)線程,則這個(gè)線程的函數(shù)原型是這樣的。DWORD WINAPI ThreadProc(PVOID pvParm) return value;因?yàn)榫€程會(huì)共享全局變量,因此多線程應(yīng)該少使用全局變量1 線程創(chuàng)建 線程的創(chuàng)建不能直接使用CreateThread API函數(shù)。而要使用C編譯環(huán)境自帶的創(chuàng)建進(jìn)程函數(shù)。#include <process.h>unsigned uThreadid=0;uintptr_t hThrea

33、d= _beginthreadex(NULL, 0,ThreadProc,NULL,CREATE_SUSPENDED,&uThreadid);第3個(gè)參數(shù)是線程函數(shù)地址,第4個(gè)參數(shù)是傳遞到線程的LPVOID,第5個(gè)參數(shù)為0線程馬上運(yùn)行、CREATE_SUSPENDED需要激活才能運(yùn)行。最后一個(gè)保存線程的ID進(jìn)程和線程ID是一個(gè)標(biāo)識(shí)。不重復(fù)。進(jìn)程和線程對(duì)象是系統(tǒng)對(duì)象,關(guān)閉這些對(duì)象對(duì)進(jìn)程和線程的運(yùn)行沒(méi)有影響。第7課 線程的調(diào)度和同步(6學(xué)時(shí))線程暫停: 創(chuàng)建時(shí)使用CREATE_SUSPENDED創(chuàng)建一個(gè)暫停的線程 使用SuspendThread暫停線程 長(zhǎng)時(shí)間不使用窗體恢復(fù)線程: Resum

34、eThread ResumeThread和SuspendThread使用次數(shù)要對(duì)應(yīng)。休眠線程 Sleep(毫秒)線程的同步是比較容易出錯(cuò)的地方,要多多實(shí)踐和理解。參見(jiàn)線程沖突的例子。每個(gè)線程對(duì)變量g累加10000次,創(chuàng)建6個(gè)線程,這是其中一次的運(yùn)行結(jié)果。可以看到結(jié)果不是60000.對(duì)線程沖突問(wèn)題的解釋1條 C的g+對(duì)應(yīng)的匯編指令為3條mov eax,ginc eaxmov g,eax如果我們創(chuàng)建兩個(gè)線程,這兩個(gè)線程將共享上面的代碼。如果只有一個(gè)CPU的話,那同一時(shí)刻只能志執(zhí)行一條匯編指令。但Windows的調(diào)度機(jī)制可以保證代碼按順序執(zhí)行,但不能保證不被打斷。舉例g=0mov eax,g /1

35、eax=0inc eax /1 eax=1mov g,eax /1 g=1 eax=1mov eax,g /2 eax=1inc eax /2 eax=2mov g,eax /2 g=2 eax=21和2兩個(gè)線程分別執(zhí)行上面的3行代碼,則g被加了兩次,得到2。但實(shí)際上這是多線程的特例。真實(shí)的情況是CPU下條要執(zhí)行那個(gè)線程的代碼是隨機(jī)的。如下g=0mov eax,g /1 eax=0inc eax /1 eax=1mov eax,g /2 eax=0inc eax /2 eax=1mov g,eax /2 g=1 eax=1mov g,eax /1 g=1 eax=1線程1在增加后沒(méi)有及時(shí)賦值給g,然后線程2執(zhí)行。最后g為1。這就是線程沒(méi)有同步導(dǎo)致的問(wèn)題,也是我們程序中出現(xiàn)的問(wèn)題。解決方法(1)原子操作函數(shù)使用InterlockedExcha

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論