第一篇:Windows編程_實驗2指導(dǎo)
Windows編程/附件資料2
實驗2MFC 框架程序的分析認(rèn)知與編程實踐(4學(xué)時)
一、實驗?zāi)康模?/p>
熟悉在Visual C++ 6.0 IDE中編輯、編譯、調(diào)試和運(yùn)行一個MFC應(yīng)用程序的基本思路;理解并掌握利用MFC開發(fā)應(yīng)用程序的一般步驟和過程;加深對MFC框架程序的特性認(rèn)識,掌握其應(yīng)用方法。了解構(gòu)件式的軟件開發(fā)思想;提高實際動手編制WinApp的能力和分析問題、解決問題的能力。
二、實驗內(nèi)容:
1、分析理解題:利用MFC AppWizard分別創(chuàng)建最基本的基于對話框的應(yīng)用程序,單文檔應(yīng)用程序和多文檔應(yīng)用程序;并從類/文件/資源等視圖角度分析比較它們各自所自動擁有的類(基類)/文件(主要是.cpp文件)/資源的異同,回答其后(即四所列)思考題;要求在實驗報告中反應(yīng)分析比較情況及你的認(rèn)知理解點滴。(必做)
2、程序設(shè)計題:以MFC編程方式,編寫并實現(xiàn)一個簡易計算器功能的應(yīng)用程序。其界面架構(gòu)形式和具體內(nèi)容自我設(shè)計,原則:架構(gòu)美觀、布局合理,內(nèi)容實用,具有可計算特性。
3、以MFC編程方式,編寫并實現(xiàn)一個SDI界面的“奧運(yùn)五環(huán)”繪圖應(yīng)用程序。(提高)提示:編寫在窗口客戶區(qū)上“繪制一張笑臉”的WinApp。
1)若用SDK API方式編程,則其WM_PAINT消息的響應(yīng)代碼為:
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
hPen=CreatePen(PS_SOLID,5,RGB(255,0,0));
SelectObject(hdc,hPen);
Ellipse(hdc,275,170,425,320);
Arc(hdc,360,215,410,240,410,225,360,225);
Arc(hdc,290,215,340,240,340,225,290,225);
Arc(hdc,320,240,380,300,320,270,380,270);
EndPaint(hwnd,&ps);
return 0;
2)若以MFC方式編程,則可利用MFC AppWizard建立一個SDI界面的應(yīng)用程序框架,然后在其視類的OnDraw()中加入如下代碼也可。
CPen pen,*oldpen;
pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
計算機(jī)科學(xué)系XYP編制2011-5-18第1 頁
oldpen=pDC->SelectObject(&pen);
pDC->Ellipse(275,170,425,320);
pDC->Arc(360,215,410,240,410,225,360,225);
pDC->Arc(290,215,340,240,340,225,290,225);
pDC->Arc(320,240,380,300,320,270,380,270);
pDC->SelectObject(oldpen);
三、實驗要求:
通過本次實驗,要求同學(xué)們能對利用MFC AppWizard、ClassWizard等實用工具編寫WinApp的方法、步驟有一個較為全面的了解,并注意理解由MFC AppWizard所生成的WinApp框架的組織架構(gòu)和作用;深刻理解在此基礎(chǔ)上開發(fā)WinApp的主要工作是“填充框架和添加必要的實現(xiàn)代碼”的含義,切實做到用理論指導(dǎo)實踐,以實踐促進(jìn)理論,提高實際動手能力和再學(xué)習(xí)的能力。具體要求如下:
1、實驗前認(rèn)真準(zhǔn)備、仔細(xì)計劃,查找相關(guān)資料,寫出預(yù)做報告,促進(jìn)理性思維能力;
2、實驗中以理性實踐的態(tài)度,積極思考,認(rèn)真領(lǐng)悟?qū)嶒炦^程出現(xiàn)的各種實驗現(xiàn)象,注意總結(jié)積累經(jīng)驗,完成實驗要求,達(dá)到實驗?zāi)繕?biāo),提高應(yīng)對問題、解決問題的能力;
3、實驗后按要求及時、認(rèn)真地完成實驗報告,按時提交。
特別強(qiáng)調(diào),注意實驗報告內(nèi)容的完整性、真實性和個異特點,使我們的兩個能力:動手和持續(xù)學(xué)習(xí)能力真正得到提高。
四、思考題:
1.在MFC應(yīng)用程序中,至少必須包含幾個類?它們分別是什么類?
2.由MFC AppWizard生成的應(yīng)用程序,都有哪些主要文件?包含哪些類及相關(guān)類的對應(yīng)功能和它們之間的關(guān)系怎樣?
3.控件使用中應(yīng)特別注意哪些問題?
4.在使用編輯框時,應(yīng)注意哪幾點?
5.ClassWizard使用中,應(yīng)關(guān)注的主要問題是什么?注意哪些問題?
溫馨小貼示:
1.MFC應(yīng)用程序必須包含的兩個基本類是CWinApp類和CFrameWnd類。CWinApp類替代了API應(yīng)用程序中的主函數(shù)WinMain()功能,封裝了與應(yīng)用程序相關(guān)的程序初始化InitApplication()和InitInstance()、消息循環(huán)Run()和程序結(jié)束ExitInstance()等功能;CFrameWnd類替代了窗口函數(shù)WndProc()的功能,封裝了消息處理和窗口銷毀等功能。
2.MFC應(yīng)用程序消息處理的路徑為:應(yīng)用程序從CWinApp派生對象,其成員函數(shù)Run()調(diào)用
CWinThread::Run(),通過GetMessage(),TranslateMessage()和DispatchMessage()進(jìn)行消息循環(huán)。每個窗口對象都使用相同的稱為AfxWndProc()的全局函數(shù),AfxWndProc()調(diào)用OnWndMsg()處理消息。OnWndMsg()負(fù)責(zé)將收到的消息分為三大類:窗口消息、命令消息和控件消息,再分發(fā)給不同的消息處理函數(shù)去處理。
3.MFC應(yīng)用程序的啟動順序:①建立、初始化CWinApp對象,該對象是全局的且只能有一個,名為theApp;②在InitInstance()函數(shù)中,創(chuàng)建文檔模板,執(zhí)行MFC框架默認(rèn)的命令行參數(shù),根椐分解的命令行信息,啟動不同類型的任務(wù),動態(tài)建立文檔、視圖、框架,并對文檔、視圖、框架進(jìn)行初始化;③顯示與更新窗口;④啟動消息循環(huán)。
五、參考書籍:
1.《Visual C++ 應(yīng)用教程》·鄭阿奇,丁有和 編著·人民郵電出版社2008.10
2.《Visual C++ 實用教程》·周進(jìn)等 編著·人民郵電出版社2008.5
3.《Windows 程序設(shè)計教程》·楊祥金等 編著·清華大學(xué)出版社·2007.4
4.《Windows可視化程序設(shè)計》·劉振安主編·機(jī)械工業(yè)出版社·2007.1
5.《Visual C++ 程序設(shè)計—基礎(chǔ)與實例分析》·朱晴婷等 編著·清華大學(xué)出版社2004.3
6.《Visual C++ 6.0實用教程》·揚(yáng)永國 主編·清華大學(xué)出版社·2004.1
7.《C++及Windows可視化程序設(shè)計》·劉振安編著·清華大學(xué)出版社·2003.7
8.《Windows C程序設(shè)計入門與提高》·柳永新等 編著·清華大學(xué)出版社·1999.7
肖云萍編寫
第二篇:Windows編程教案
Windows編程教案
第一課
最簡單的Windows程序(2學(xué)時)
Windows編程是一個很大的主題,涉及的方面也非常的多。Windows始于90年代,至今Windows編程的發(fā)展已經(jīng)非常成熟了,而單獨(dú)直接使用API的開發(fā)也是越來越少了。因此,市面上很少有泛泛的簡單入門級的Windows程序設(shè)計了。一個是系統(tǒng)級的Windows編程介紹,如Windows核心編程。一個是方向級的Windows編程介紹如Windows圖形編程,Windows網(wǎng)絡(luò)編程等等。我們這次課的主要參考用書是Windows核心編程,同時也參考了一些其他內(nèi)容。鑒于教材的價格較貴,同時也需要考慮我們自身的學(xué)習(xí)內(nèi)容不一定很多以及學(xué)時的原因,就沒有定教材??次业慕贪赴?。
(1)Win32 API API : Application Program Interface。應(yīng)用程序接口。API就是在進(jìn)行Windows編程時使用的函數(shù)庫。本課就是
Windows編程=API+C語言(或者C++語言)(2)開發(fā)環(huán)境
我校機(jī)器上安裝了VC++ 6.0。相信這是大家一直以來學(xué)習(xí)C,C++使用的開發(fā)環(huán)境。但VC60離我們實在太遠(yuǎn)了,它是一款90年代的產(chǎn)品,已經(jīng)近20年的歷史了。我們機(jī)器里還有VS2005 或 VS2008,那里面的C環(huán)境要比VC60強(qiáng)太多了,強(qiáng)烈建議大家使用更高級的平臺。本次授課的開發(fā)環(huán)境有兩個。一個是輕量級的DEV C++,一個是重量級的VS2010.簡單程序我們都將用DEV C++來實現(xiàn)。
DEV C++是一個非常小的C環(huán)境,但性能要優(yōu)于VC60,調(diào)試環(huán)境不如VC60。這個環(huán)境在我們的共享資源里有,大家可以下載安裝。安裝過程非常簡單,一直下一步即可。
這是其主界面。
(3)最簡單的Windows程序
提到最簡單的程序,幾乎所有的人都會想起經(jīng)典的HelloWorld。
這不是Windows程序,如果在以前這叫DOS程序,現(xiàn)在叫Windows控制臺應(yīng)用程序。它不算Windows程序,但它很簡單的就把Helloword顯示到屏幕上了。而Windows程序要想把HelloWorld顯示在屏幕上就確實不容易了。
3.1 訪問Helloworld網(wǎng)站,因為把Helloworld顯示在屏幕上并不容易,我們可以一點一點來,先讓Helloworld以文字形式出現(xiàn)在其他地方,這里我們通過訪問網(wǎng)站004km.cnE,HINSTANCE,LPSTR,int nShow)DefWindowProc(HWND,UINT,WPARAM,LPARAM)GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax).如果得到WM_QUIT返回0 TranslateMessage(&MSG)DispathMessage(&MSG)BeginPaint(&PAINTSTRUCT)TextOut(HDC,INT,INT,LPSTR,INT)EndPaint(HWND,&PAINTSTRUCT)作業(yè):
自己建立應(yīng)用,在窗口100,100位置顯示HelloWorld 第三課 坐標(biāo)位置及大?。?學(xué)時)
在我們寫控制臺應(yīng)用的時候,不能自由的控制輸出顯示的位置。因此,沒有學(xué)習(xí)過這方面的內(nèi)容,現(xiàn)在我們創(chuàng)建了窗口,并且在窗口上顯示了Hello World。這個過程涉及到很多涉及位置和大小的因素,如窗口的大小,顯示的位置,文字顯示的位置。說到位置,就涉及定位,說到定位就要說坐標(biāo)系。在屏幕上顯示內(nèi)容涉及到坐標(biāo)空間的知識。在Windows應(yīng)用中坐標(biāo)空間分如下幾部分內(nèi)容
1、物理坐標(biāo)空間
物理坐標(biāo)空間,指的是物理設(shè)備上對應(yīng)的坐標(biāo)系。如顯示器
坐標(biāo)原點在左上角。如下是一個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è)備空間是物理空間體系的一個子空間。設(shè)備空間可以依賴于一個窗口。換句話可以把設(shè)備空間理解為在物理空間上顯示的一個對象,其子空間。下面我們通過一個小例子理解物理空間和設(shè)備空間
在窗口的標(biāo)題條,以設(shè)備坐標(biāo),和物理坐標(biāo)的形式顯示鼠標(biāo)在窗口內(nèi)的位置
WndProc處理消息循環(huán)
WM_MOUSEMOVE,鼠標(biāo)移動時消息標(biāo)識,是個整數(shù)。其參數(shù)lParam,的第16位代表設(shè)備坐標(biāo)中的X,高16位代表設(shè)備坐標(biāo)的Y。POINT 是結(jié)構(gòu)體。只有x,y兩個成員 ClientToScreen,將設(shè)備坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)(物理坐標(biāo))sprintf:格式化字符串
SetWindowText:設(shè)Window標(biāo)題
3、頁面坐標(biāo)空間(邏輯坐標(biāo)空間的一種)
作用,可以任意指定坐標(biāo)原點,坐標(biāo)軸方向,比例尺等信息。可以用來與設(shè)備無關(guān)的大小如厘米,毫米等。
頁面坐標(biāo)叫窗口,其表示有原點(X,Y),寬度,高度組成(WIDTH,HEIGHT)設(shè)備坐標(biāo)叫視口,其表示有原點(x,y),寬度,高度組成(width,height)
頁面坐標(biāo)和設(shè)備坐標(biāo)的變換關(guān)系,大寫為設(shè)備坐標(biāo),小寫為頁面坐標(biāo)
PX=X+(px-x)*WIDTH/width PY=Y+(py-y)*HEIGHT/height
px=x+(PX-X)*width/WIDTH py=y+(PY-Y)*heigh/HEIGHT
GDI函數(shù)使用頁面坐標(biāo),顯示出來時是設(shè)備坐標(biāo)
通過對窗口,是否對應(yīng)的四個參數(shù)的設(shè)置,可以實現(xiàn)特殊的變換。頁面坐標(biāo)是邏輯坐標(biāo)的一種。在這個例子中我們一直使用 MoveToEx(ps.hdc,0,0,NULL);
LineTo(ps.hdc,30,30);劃線,MoveToEx是把畫筆移動到指定位置(頁面坐標(biāo)),LineTo是從畫筆所在位置到目標(biāo)位置畫一條線。
在這個例子中,每次劃線前通過設(shè)置視口,窗口結(jié)果使劃線的結(jié)果不同。這種形式的坐標(biāo)轉(zhuǎn)換無法實現(xiàn)旋轉(zhuǎn)
4、世界坐標(biāo)空間(邏輯坐標(biāo)空間的另一種)功能:比頁面坐標(biāo)空間方便,可以實現(xiàn)旋轉(zhuǎn) 結(jié)構(gòu)體 XFORM{ FLOAT eM11, FLOAT eM12, FLOAT eM21, FLOAT eM21, FLOAT eDx, FLOAT eDy, } 世界坐標(biāo)到設(shè)備坐標(biāo)的變換。小寫到大寫。PX=eM11*px+eM21*py+eDx;PY=eM12*px+eM22*py+eDy;默認(rèn)為{1,0,0,1,0,0} 和設(shè)備坐標(biāo)相同 {1001dxdy} {mx00my00}縮放 {-100-100}映像
旋轉(zhuǎn){cos(a),sin(a),-sin(a),cos(a),0,0}順時針旋轉(zhuǎn)a度 {cos(a),-sin(a),sin(a),cos(a),0,0}逆時針旋轉(zhuǎn)a度
我們下面的例子通過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)軸
頁面坐標(biāo)和世界坐標(biāo)均是邏輯坐標(biāo),可以改變坐標(biāo)軸,世界坐標(biāo)功能更強(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);
各個窗口設(shè)備坐標(biāo)之間的轉(zhuǎn)換
BOOL SetWindowOrgEx(HDC hdc, int X,int Y,LPPOINT lpPoint);設(shè)置窗口的原點
SetViewportOrgEx(HDC hdc,int X,int Y,LPPOINT lpPoint);設(shè)置視口的原點
BOOL SetViewportExtEx(HDC hdc, int nXExtent, int nYExtent,LPSIZE lpSize);設(shè)置視口的width,height BOOL SetWindowExtEx(HDC hdc, int nXExtent,int nYExtent, 設(shè)置窗口的width,height SetMapMode設(shè)置頁面坐標(biāo)的映射模式 SetGraphicsMode設(shè)置世界坐標(biāo)的映射模式 Rectangle繪制矩形,并填充內(nèi)部 SetWorldTransform設(shè)置世界坐標(biāo)變換 LineTo:換線
MoveToEx:移動畫筆
SetWindowText設(shè)置窗口標(biāo)題
LPtoDP(hdc,LPPOINT,int)把邏輯坐標(biāo)點轉(zhuǎn)換為設(shè)備坐標(biāo)點 作業(yè):
使用movetoex,lineto,LPtoDP及世界坐標(biāo)變換,繪制正六邊形
LPSIZE lpSize);
提示:
畫一條水平線后,將坐標(biāo)原點移動到線的末尾,并將坐標(biāo)軸旋轉(zhuǎn)60度*n,重復(fù)上步 要將坐標(biāo)移動到線尾需要使用LPtoDP
第四課 色彩及繪制(6學(xué)時)
(1)畫點
像素:計算機(jī)屏幕上的一個點。是計算機(jī)屏幕顯示的最小單位。點的個數(shù)取決于計算機(jī)的分辨率。如1024*768,則屏幕由1024*768個點組成。每個點都可以獨(dú)立的顯示一個顏色。計算機(jī)能夠表示的顏色有256*256*256=16777216種。顏色的表示 COLORREF。定義顏色RGB COLORREF color=RGB(紅,綠,藍(lán))隨機(jī)繪制顏色點
需要#include
GetTickCount(): API函數(shù),得到系統(tǒng)開機(jī)后到現(xiàn)在的滴答數(shù),特點就是每次返回的結(jié)果不重復(fù)。
兩者的配合得到不重復(fù)的隨機(jī)數(shù)序列
rand得到函數(shù)
SetPixel設(shè)置某點的顏色
(2)畫線
在以前的例子里我們一直用1個像素寬的黑色實現(xiàn)來畫線?,F(xiàn)在我們學(xué)習(xí)創(chuàng)建畫筆,用畫筆來畫線。
步驟
1、創(chuàng)建畫筆CreatePen(畫筆類型,寬度,顏色)
2、將畫筆選入設(shè)備上下文SelectObject
3、用畫筆繪制
4、將畫筆選出設(shè)備
5、刪除創(chuàng)建的畫筆對象
SelectObject是將GDI對象畫筆選入設(shè)備上下文,并將當(dāng)前的選出返回。因此我們兩次使用SelectObject,最后一個將以前的畫筆選入,返回我們創(chuàng)建的,并在下一步刪除畫筆。
虛線只能支持寬度1.畫線函數(shù)
Polygon(HDC,LPPOINT,INT).連接指定點,畫多邊形,封閉。如果畫4邊形則確認(rèn)3個點即可。
Polyline(HDC,LPPOINT,INT).連接指定點,畫多邊,不封閉 MoveToEx:移動畫筆
LineTo:用當(dāng)前的畫筆劃線
Arc:畫圓弧 BOOL Arc(HDC hdc, int nLeftRect, int nTopRect, int nRightRect,int nBottomRect, int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc);前4個是畫圓弧的矩形,后四個指定了弧開始和結(jié)束的位置 作業(yè):畫一條正弦曲線
使用SexPixel,LineTo,MoveToEx實現(xiàn)
(3)畫面
畫面就是用畫刷來填充 步驟
1、創(chuàng)建畫刷CreateSolidBrush(顏色)
2、將畫刷選入設(shè)備上下文SelectObject
3、用畫刷填充
4、將畫刷選出設(shè)備
5、刪除創(chuàng)建的畫刷對象
用藍(lán)色畫刷填充矩形,矩形的邊框是黑色。CreateSolidBrush:創(chuàng)建顏色畫刷
Rectangle:繪制矩形,用當(dāng)前的Pen繪制邊框,用當(dāng)前的Brush來填充矩形內(nèi)部 FillRect:畫刷填充矩形。FillRect(hdc,&RECT,HBRUSH)
使用FillRect不繪制邊框,因為參數(shù)中有畫筆,也不用SelectObject了。Ellipse:橢圓,圓。畫邊框,填充 Pie:圓餅(4)位圖
將文件系統(tǒng)中的位圖顯示到窗口中。繪制位圖步驟
1、根據(jù)現(xiàn)有的設(shè)備上下文創(chuàng)建兼容的設(shè)備上下文
2、加載位圖
3、繪制圖像
4、刪除加載的位圖
5、刪除兼容的設(shè)備上下文
BitBlt是在設(shè)備上下文之間拷貝圖像的函數(shù),非常常用
在上一個列子的基礎(chǔ)上,得到位圖的大小并繪制實際大小的位圖 作業(yè):
在一個窗口上顯示一副位圖文件(*.bmp)。(5)字體和文本
創(chuàng)建邏輯字體并顯示文本 步驟
1、創(chuàng)建邏輯字體
2、選入字體
3、輸出文本
4、選出字體
5、刪除字體
另一個與文本繪制有關(guān)的功能更強(qiáng)的函數(shù)是DrawText 總結(jié):本課介紹了一些基本的繪圖操作,其中涉及了較多的函數(shù),這里只是介紹了基本的使用方式和原理。函數(shù) srand rand GetClientRect SetPixel LineTo MoveToEx CreatePen CreateSolidBrush CreateFontIndirect BitBlt SelectObject DeleteObject CreateCompatibleDC LoadImage Rectangle FillRect DeleteDC 等等。
第五課 常用控件的使用(6學(xué)時)
在上面的幾節(jié)課程中我們學(xué)習(xí)了如何建立Windows 應(yīng)用,并在圖形環(huán)境下繪制圖形。這些操作都是控制臺應(yīng)用中沒有的。本章我們介紹如何在窗口中加入按鈕等常規(guī)控件,并且處理它們。
一般控件種類,按鈕,列表組合,編輯,列表,滾動條,靜態(tài)文本??丶且环N特殊的窗口。這些特殊窗口的類已經(jīng)由Windows系統(tǒng)注冊了,不需要我們注冊。這些類的名字分別為。
BUTTON,COMBOBOX,EDIT,LISTBOX,SCROLLBAR,STATIC(1)創(chuàng)建
任何時候均可,但通常在WM_CREATE事件中處理
WM_CREATE是在窗口創(chuàng)建時觸發(fā) WM_DESTORY是在窗口銷毀時觸發(fā)
控件用CreateWindow創(chuàng)建,返回控件窗體的句柄,窗體的類型一定為WS_CHILDWINDOW。附加的類型以或關(guān)系疊加。具體要參見MSDN(2)操控
控制這些控件是通過向這些控件的窗體句柄發(fā)送特點消息來實現(xiàn)的 如 SendMessage(控件句柄,消息指,參數(shù)1,參數(shù)2)具體設(shè)置參見MSDN 在上面的例子,我們處理下拉列表的時候使用了SendMessage發(fā)送消息(3)反饋
我們操作控件會觸發(fā)控件的事件得到一些反饋,下面介紹如何得到這些反饋??傮w上,我們把這些反饋過程叫通知。通知的過程是將反饋發(fā)送給父窗體,一般父窗體有兩個事件接收控件的反饋
WM_NOTIFY,WM_COMMAND。WM_COMMAND HIWORD(wParam)通知消息號 LOWORD(wParam)控件標(biāo)識 WM_NOTIFY wParam :控件標(biāo)識 lParam:NHMDR的指針
比如按鈕的單機(jī)對應(yīng)的事件是BN_CLICKED。該事件通過WM_COMMAND通知。
我們把上個例子補(bǔ)充完整,并且為每個控件指定ID,指定的方式是在(HMENU)的后面寫個整數(shù),原則上應(yīng)該不同。
HIWORD,得到一個字的高字節(jié)。LOWORD得到一個字的低字節(jié)。(4)通用控件
我們上面介紹的是基本的控件,除了這些基本控件外還有一些通用控件。這些控件的使用和處理和基本的控件差不多,但功能更強(qiáng)大。ANIMATE_CLASS : 動畫控件,播放AVI動畫 DATETIMEPICK_CLASS :日期時間下拉控件 HOTKEY_CLASS :定義熱鍵的控件 MONTHCAL_CLASS : 月份選擇控件 PROGRESS_CLASS :進(jìn)度條控件 REBARCLASSNAME :rebar控件 STATUSCLASSNAME:狀態(tài)條控件 TOOLBARCLASSNAME :工具條 TOOLTIPS_CLASS :提示控件 TRACKBAR_CLASS :軌跡條 UPDOWN_CLASS :上下箭頭
WC_COMBOBOXEX :組合框擴(kuò)展 WC_HEADER :頭控件
WC_IPADDRESS :IP地址控件 WC_LISTVIEW :listview控件
WC_PAGESCROLLER :頁滾動控件 WC_TABCONTROL :tabControl控件 WC_TREEVIEW :樹視圖控件
通用控件在使用前使用InitCommonControlsEx初始化。使用這些通用控件要include
頭部
這些控件和IE有關(guān)系,根據(jù)IE版本不同,控件的外觀和功能有區(qū)別。
(5)創(chuàng)建菜單
CreateMenu:創(chuàng)建一個菜單
CreatePopupMenu:創(chuàng)建一個子菜單 AppendMenu:向菜單增加項目 SetMenu:將菜單聯(lián)系到窗口
第六課 進(jìn)程及線程(2學(xué)時)
? 進(jìn)程:是一個正在運(yùn)行的程序的實例。由兩個部分組成
1、一個是操作系統(tǒng)用來管理進(jìn)行的內(nèi)核對象。內(nèi)核對象是系統(tǒng)用來存放關(guān)于進(jìn)程信息的地方。
2、地址空間,每個進(jìn)行都有自己的地址空間
進(jìn)程本身不執(zhí)行代碼,進(jìn)程要至少擁有一個線程,由線程來執(zhí)行代碼。每個線程都擁有自己的CPU寄存器和堆棧。當(dāng)創(chuàng)建一個進(jìn)程時系統(tǒng)會自動創(chuàng)建一個主線程。
CreateProcess創(chuàng)建進(jìn)程
內(nèi)部執(zhí)行細(xì)節(jié):1 創(chuàng)建一個小的結(jié)構(gòu)存放進(jìn)程信息分配地址空間
創(chuàng)建一個小的結(jié)構(gòu)存放線程信息
執(zhí)行C/C++啟動代碼,最終會調(diào)用WinMain或main。結(jié)束一個進(jìn)程 TerminateProcess
TerminateProcess 1 使用ToolHelp遍歷系統(tǒng)進(jìn)程
列舉系統(tǒng)全部的進(jìn)程
需要
#include
? 線程
線程由兩個部分組成 內(nèi)核對象 線程堆棧,用于維護(hù)執(zhí)行代碼時所有的函數(shù)參數(shù)和局部變量 進(jìn)程是活波的,進(jìn)程不執(zhí)行任何東西,它是線程的容器。線程在進(jìn)程的地址空間中執(zhí)行代碼。如果一個進(jìn)程擁有多個線程則這些線程共享進(jìn)程地址空間內(nèi)的代碼和數(shù)據(jù)。進(jìn)程的地址空間要比線程占用更多的系統(tǒng)資源,因此要更多的使用線程。每個線程必須有個入口點函數(shù),主線程是main,WinMain。如果要創(chuàng)建一個線程,則這個線程的函數(shù)原型是這樣的。DWORD WINAPI ThreadProc(PVOID pvParm){
return value;} 因為線程會共享全局變量,因此多線程應(yīng)該少使用全局變量 1 線程創(chuàng)建
線程的創(chuàng)建不能直接使用CreateThread API函數(shù)。而要使用C編譯環(huán)境自帶的創(chuàng)建進(jìn)程函數(shù)。
#include
unsigned uThreadid=0;uintptr_t hThread=
_beginthreadex(NULL, 0,ThreadProc,NULL,CREATE_SUSPENDED,&uThreadid);第3個參數(shù)是線程函數(shù)地址,第4個參數(shù)是傳遞到線程的LPVOID,第5個參數(shù)為0線程馬上運(yùn)行、CREATE_SUSPENDED需要激活才能運(yùn)行。最后一個保存線程的ID 進(jìn)程和線程ID是一個標(biāo)識。不重復(fù)。進(jìn)程和線程對象是系統(tǒng)對象,關(guān)閉這些對象對進(jìn)程和線程的運(yùn)行沒有影響。
第7課 線程的調(diào)度和同步(6學(xué)時)線程暫停:
創(chuàng)建時使用CREATE_SUSPENDED創(chuàng)建一個暫停的線程
使用SuspendThread暫停線程
長時間不使用窗體 恢復(fù)線程:
ResumeThread
ResumeThread和SuspendThread使用次數(shù)要對應(yīng)。
休眠線程 Sleep(毫秒)線程的同步是比較容易出錯的地方,要多多實踐和理解。參見線程沖突的例子。
每個線程對變量g累加10000次,創(chuàng)建6個線程,這是其中一次的運(yùn)行結(jié)果??梢钥吹浇Y(jié)果不是60000.對線程沖突問題的解釋
一條C的g++對應(yīng)的匯編指令為3條 mov eax,[g] inc eax mov [g],eax
如果我們創(chuàng)建兩個線程,這兩個線程將共享上面的代碼。如果只有一個CPU的話,那同一時刻只能志執(zhí)行一條匯編指令。但Windows的調(diào)度機(jī)制可以保證代碼按順序執(zhí)行,但不能保證不被打斷。舉例 g=0 mov eax,[g] //1 eax=0 inc eax
//1 eax=1 mov [g],eax //1 g=1 eax=1 mov eax,[g] //2 eax=1 inc eax
//2 eax=2 mov [g],eax //2 g=2 eax=2 1和2兩個線程分別執(zhí)行上面的3行代碼,則g被加了兩次,得到2。但實際上這是多線程的特例。真實的情況是CPU下條要執(zhí)行那個線程的代碼是隨機(jī)的。如下
g=0 mov eax,[g] //1 eax=0 inc eax
//1 eax=1 mov eax,[g] //2 eax=0 inc eax
//2 eax=1 mov [g],eax //2 g=1 eax=1 mov [g],eax //1 g=1 eax=1
線程1在增加后沒有及時賦值給g,然后線程2執(zhí)行。最后g為1。這就是線程沒有同步導(dǎo)致的問題,也是我們程序中出現(xiàn)的問題。解決方法(1)原子操作函數(shù)
使用InterlockedExchangeAdd,加減
InterlockedExchange 賦值
InterlockedCompareExchange 比較賦值
使用這些函數(shù)加減變量,保證只有執(zhí)行完后其他進(jìn)程才能進(jìn)入。
結(jié)果是60000了,但是按理應(yīng)該輸出六次“線程運(yùn)行了結(jié)束了”。但只顯示兩次,其實每次的結(jié)果多不會一樣。這也是并發(fā)帶來的問題。
解決方法(2)關(guān)鍵代碼段
在使用關(guān)鍵段之前使用該函數(shù)
輸出了6次,但每次對應(yīng)的g值不一定以10000遞增。如果把進(jìn)入關(guān)鍵段的位置提前到最前面可以得到常規(guī)的理解
這時這6個進(jìn)程某種意義上沒有并發(fā)執(zhí)行。
局限:關(guān)鍵代碼段只能在一個進(jìn)程內(nèi)使用,沒有等待時長的限制容易死鎖。解決方法(3)內(nèi)核對象 具備通知狀態(tài)的內(nèi)核對象 進(jìn)程 線程 作業(yè)
文件修改通知 事件
可等待定時器 文件 信標(biāo)
控制臺輸入 互斥對象 舉個例子
取消注釋后,一次顯示一個。體現(xiàn)了該函數(shù)對線程的控制。
(1)事件控制
盡管WaitForSingleObject可以等待很多對象的反應(yīng),但其主要還是用來處理事件等對象。事件是一種內(nèi)核對象,有兩個狀態(tài),一個用于表示該事件是自動重置事件還是人工重置事件。人工重置事件等待該事件的線程都會得到通知,自動重置事件只有一個線程會得到通知。另一個是事件的通知狀態(tài)。一是未通知狀態(tài)線程等待,一個是已通知狀態(tài),線程運(yùn)行。CreateEvent(NULL,自動(false)還是手工(true),通知(true)未通知(false)。HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPTSTR lpName);最后一個是為事件起個名字,同名事件不能建立兩次。保證同名事件只能建立一次,可以為空。SetEvent:設(shè)為已通知狀態(tài) ResetEvent:設(shè)為未通知狀態(tài)
OpenEvent:打開一個已經(jīng)存在的時間,返回Handle
創(chuàng)建自動通知,立即通知事件
對自動通知事件SetEvent有意義,對手工通知事件無意義。手工通知同時顯示6個窗口,自動通知一次顯示1個(2)信標(biāo)內(nèi)核對象
使用信標(biāo)可以確定讓幾個線程同時運(yùn)行
CreateSemaphore(NULL,初始數(shù),最大數(shù),名稱)OpenSemaphore
最多同時有3個線程運(yùn)行。(3)互斥對象
互斥對象和關(guān)鍵代碼段的作用相同,效率比關(guān)鍵代碼段低。但運(yùn)行不同進(jìn)程間使用互斥對象,同時可以設(shè)置最大的等待時長?;コ鈱ο蠛推渌麅?nèi)核對象的區(qū)別,互斥對象可以記錄調(diào)用的線程ID,一旦線程得到該對象同線程的其他地方的等待將不會等待。CreateMutex(NULL,初始等待,名稱)OpenMutex(0,NULL,名稱)ReleaseMutex(HANDLE),只能是否本線程得到的對象
(4)
第三篇:Windows編程知識點總結(jié)
1、基于MFC對話框程序的框架代碼主要由一下幾個部分組成:
A.應(yīng)用程序類
B.對話框類
C.資源文件
D.預(yù)編譯文件
2、Windows是建立在消息驅(qū)動機(jī)制上的。
3、模態(tài)對話框運(yùn)行機(jī)制?
當(dāng)模態(tài)對話框產(chǎn)生后,應(yīng)用程序沒有處理消息,唯一的解釋就是模態(tài)對話框產(chǎn)生后會屏蔽其他窗體消息。事實也正是如此,創(chuàng)建模態(tài)對話框后,應(yīng)用程序只會響應(yīng)該對話框的消息,知道應(yīng)用收到結(jié)束模態(tài)對話框窗體的消息后,才會把控制權(quán)交還給應(yīng)用程序。
4、非模態(tài)對話框
與模態(tài)對話框不同,非模態(tài)對話框不會壟斷用戶的輸入,用戶任然可以使用其他窗體。
5、屬性對話框主要分為兩個部分:
A.屬性頁
B.屬性對話框架
6、屬性頁只是對話框的一種形式。
7、控件的邏輯順序決定著軟件中需要使用TAB進(jìn)行焦點切換時的順序排列。
8、控件按鈕有四種基本類型:
A.下壓按鈕
B.復(fù)選按鈕
C.單選按鈕
D.自繪按鈕
9、按鈕控件會向父窗口發(fā)出控件通知消息
A.BN_CLICKED:鼠標(biāo)單擊消息
B.BN_DOUBLECLICKED:鼠標(biāo)雙擊擊消息
C.BN_SETFOCUS:獲取用戶輸入焦點
D.BN_KILLFOCUS:失去用戶輸入焦點
10、在MFC環(huán)境下,除了使用CButton類本身的成員函數(shù)來操作按鈕控件,還可以使用窗體相關(guān)類的成員函數(shù),使用這些函數(shù)可以根據(jù)按鈕ID直接進(jìn)行操作。
11、MFC的CEdit類封裝了編輯框控件的基本操作。
12、UPPERCASES設(shè)置大寫,lowerCase設(shè)置小寫,Number設(shè)置只能接受數(shù)字,Password設(shè)置顯示為*。
13、MFC的CListBox類封裝了列表框控件的基本操作。
14、AddString:添加字符串列表項
DeleteString:刪除字符串列表項
Dir:從當(dāng)前目錄向列表框添加文件名
FindString:在列表框中查找包含指定前綴的第一個列表項
FindStringExact:在列表框中查找與指定字符串匹配的列表項
InsertString:向列表框中插入一個列表項
ResetContentp:清空編輯框和列表框的所有內(nèi)容
Selectstring:在列表框中查找字符串
15、組合框有三種模式:
簡易式
下拉式
下拉列表式
16、組合框有兩種形式:
Dropdown樣式
Drop List樣式
17、MFC的CProgressCtrl類封裝了進(jìn)度條控件的基本操作。
18、tist->SetTimer(1,100,NULL)
設(shè)置計時器ID為1,每100ms觸發(fā)一次
19、tist->KillTimer(1)
關(guān)閉計時器120、列表控件有四種呈現(xiàn)方式:
圖標(biāo)視圖
小圖標(biāo)視圖
列表視圖
報表視圖
21、文檔視圖結(jié)構(gòu)是使用MFC開發(fā)基于文檔的應(yīng)用程序的基本框架,最主要的思想是數(shù)據(jù)的管理與顯示分離。
22視圖類CView23、使用AppWizard創(chuàng)建SDI和MDI的過程相似,主要區(qū)別是創(chuàng)建SDI時不生成CChildFrame類,CMainFrame的基類為CMainWnd;而創(chuàng)建MDI時會生成兩個框架類,一個是CMainFrame類,由CMDIFrameWnd類派生而來,另一個是CChildFrame類,由CMDIChildWnd類派生而來
24、文檔與視圖體系
一個文檔可以對應(yīng)多個視圖,而一個視圖只能對應(yīng)一個文檔
文檔與視圖的結(jié)構(gòu)的優(yōu)勢在于數(shù)據(jù)的管理與顯示分離,在開發(fā)文檔/視圖體系開發(fā)應(yīng)用過程時,涉及到:文檔模板、文檔、視圖、框架窗口
25、MFC的CView類是所有視圖類的基類,主要有兩大工能:
將與其相關(guān)聯(lián)文檔的數(shù)據(jù)呈現(xiàn)給用戶
接受用戶對數(shù)據(jù)的修改,并反饋給文檔
26、建立MFC單文檔應(yīng)用程序,實例項目名稱為“single”框架會自動生成4個類:
CSingleApp類:應(yīng)用程序類
CMainFrame類:框架類
CSingleDoc文檔類
CSingleView類:視圖類
27、在MFC中使用GDI 進(jìn)行繪畫操作一般會涉及兩類對象:
設(shè)備上下文對象
GDI對象
28、設(shè)備上下文,是一種windows數(shù)據(jù)結(jié)構(gòu),它包含與設(shè)備繪制屬性相關(guān)的信息。
29、主要有一下幾種GDI 對象:
CPen對象:用來繪制線條
CBrush對象:用來填充繪制對象的內(nèi)部
CBitmap對象:用來操作位圖對象
CFont對象:用來繪制文本
CPalette對象:用于應(yīng)用程序和色彩輸出設(shè)備之間的接口
30、使用GDI進(jìn)行圖形繪制的一般流程:
創(chuàng)建GDI對象
創(chuàng)建獲取得設(shè)備上下文對象
使用SelectObject把GDI對象選入設(shè)備上下文
使用圖形輸出函數(shù)在指定上下文中繪制圖形
31、畫刷其實是一個像素大小為8*8的位圖,用多個相同的位圖對封圖形的內(nèi)部進(jìn)行填充
32、位圖
位圖是描述圖形最簡單直觀的一種形式,把圖像橫向分為等間距的W列,縱向分為等間距的H列,于是這個圖形的大小被定義為分辨率W*H33、鍵盤上的每一個健都對應(yīng)一個唯一的掃描碼,在windows系統(tǒng)中為實現(xiàn)設(shè)備無關(guān)的要求,需要使用虛擬鍵值
34、當(dāng)有鍵盤事件發(fā)生時,設(shè)備驅(qū)動器首先獲取健的掃描碼,并轉(zhuǎn)換為虛擬鍵值
35、在應(yīng)用程序中響應(yīng)鍵盤消息有兩種方式:
響應(yīng)本進(jìn)程的鍵盤消息
響應(yīng)系統(tǒng)的鍵盤消息
36、keybd_event只是用于產(chǎn)生鍵盤事件,至于由誰來處理他并不關(guān)心。系統(tǒng)捕捉到鍵盤事件后,會轉(zhuǎn)化為鍵盤消息的形式派發(fā)給當(dāng)前系統(tǒng)中擁有鍵盤輸入焦點的應(yīng)用程序。SendMessage和PostMasseage的區(qū)別在于,PostMasseage首先把消息發(fā)到指定句柄所在線程的消息隊列再由線程派發(fā)。SendMessage是把消息直接發(fā)送的指定句柄的窗體或控件。而往往很多情況下。指定句柄是個控件。而對控件的消息消息處理一般都是定義在主對話框上的。除非對其進(jìn)行子類化,如果使用SendMessage,消息就無法到達(dá)主對話框因而無法達(dá)到預(yù)期的效果。
37、TCP協(xié)議是一個面向連接的、可靠的協(xié)議,UDP協(xié)議是一個不可靠的、無連接的協(xié)議
38、因特網(wǎng)控制報文協(xié)議(Internet Control Message Protocol,ICMP)
39、套接字是一種網(wǎng)絡(luò)編程接口,提供了一種網(wǎng)絡(luò)數(shù)據(jù)發(fā)送和接受機(jī)制,套接字是網(wǎng)絡(luò)通信的基礎(chǔ),一個套接字表示通信的一端,使用套接字可以實現(xiàn)數(shù)據(jù)包在網(wǎng)絡(luò)上的傳輸。
40、soket函數(shù),用來根據(jù)指定的地址協(xié)議簇、套接字類型和協(xié)議類型創(chuàng)建一個套接字。
listen函數(shù),監(jiān)聽遠(yuǎn)程連接
accept函數(shù),用來接受客戶端連接。
sendto函數(shù),用來向指定地址發(fā)送數(shù)據(jù)。
recv函數(shù),用來在已建立連接的套接字上接收數(shù)據(jù)。
recvfrom函數(shù),用來在指定套接字上接收數(shù)據(jù)。
setsockopt函數(shù),用來設(shè)置套接字屬性。
41、進(jìn)程是一個正在運(yùn)行的程序的實例,有兩部分組成:
一個操作系統(tǒng)用來管理進(jìn)程的內(nèi)核對象。
創(chuàng)建時系統(tǒng)所分配的資源,主要是內(nèi)存地址單元。
41、進(jìn)程地址空間作為一個載體。包含進(jìn)城的所有數(shù)據(jù)和代碼以及堆和棧。為線程的運(yùn)行提供保障。
42、進(jìn)程是靜態(tài)的43、線程也有兩個部分組成:
線程內(nèi)核對象;線程堆棧。
44、線程是動態(tài)的、可執(zhí)行的、它總是在某個進(jìn)程的環(huán)境中創(chuàng)建的。
45、每個線程都是運(yùn)行在其所屬進(jìn)程的地址空間,因此線程只能訪問本進(jìn)程的地址空間,而其他進(jìn)程對其是不可見的46、所謂‘頁’,只是操作系統(tǒng)為了更好的管理地址空間所產(chǎn)生的一個邏輯上的概念,把一個固定長度的地址空間作為一個頁,通常為4kb,系統(tǒng)在在對地址空間進(jìn)行管理時,把每4kb的空間作為一個單位,最終形成內(nèi)存管理的多級索引結(jié)構(gòu)。
47、物理存儲器和進(jìn)程虛擬地址空間的映射是無序的,每一個進(jìn)程虛擬地址空間也只能由一個物理存儲器頁來映射。
48、“地址轉(zhuǎn)換機(jī)構(gòu)”就是負(fù)責(zé)他們彼此之間的關(guān)聯(lián)。
49、虛擬內(nèi)存也有三種基本狀態(tài):
空閑:地址空間沒有被占用,不能使用
保留:地址空間沒有被占用,但還沒有與物理存儲器相關(guān)聯(lián),不能使用。
提交:且已經(jīng)與物理存儲器相關(guān)聯(lián),可以使用。
50、內(nèi)存映射文件
內(nèi)存映射文件可以在進(jìn)程中保留一個地址空間區(qū)域,并把磁盤文件提交給該區(qū)域。一旦映射成功,就可以在內(nèi)存中直接操作文件,而不再需要使用readfile、writefile等文件操作API。
51、情況下會使用內(nèi)存映射文件:
系統(tǒng)使用內(nèi)存映射文件加載可執(zhí)行模塊(.exe)和動態(tài)鏈接(DDL)
操作數(shù)據(jù)文件
共享內(nèi)存
52、消息傳遞
消息傳遞機(jī)制并不以進(jìn)程為界限,處理消息的是窗體,而與是否在同一進(jìn)程無關(guān)。因而在進(jìn)程間使用消息傳遞作為通信手段有個前提,即都是窗體應(yīng)用程序。
53、共享內(nèi)存的原理
使用內(nèi)存共享機(jī)制,在任何一個進(jìn)程內(nèi)創(chuàng)建內(nèi)存映射,卻能夠在其他多個進(jìn)程中使用。這些進(jìn)程共享的是物理內(nèi)存器的同一個頁面,把這些物理內(nèi)存映射到虛擬內(nèi)存時各個進(jìn)程的虛擬地址不一定相同。當(dāng)一個進(jìn)程將數(shù)據(jù)寫入共享內(nèi)存時,其他進(jìn)程可以立即獲取數(shù)據(jù)變更情況,顯然這種共享內(nèi)存的方式是完全可以滿足在進(jìn)程間進(jìn)行大數(shù)據(jù)快速傳輸任務(wù)要求的。
54、與內(nèi)存映射磁盤文件一樣,共享內(nèi)存的本質(zhì)也是內(nèi)存映射機(jī)制。
55、使用系統(tǒng)頁文件支持的內(nèi)存映射文件,及共享內(nèi)存。
56、進(jìn)程間通信的三種基本方法:匿名管道、命名管道、郵槽
57、管道是用于進(jìn)程間通信的共享內(nèi)存區(qū)域。創(chuàng)建管道的進(jìn)程稱為管道服務(wù)器,而連接這兩個管道的進(jìn)程稱為管道客戶端,一個進(jìn)程向管道寫入信息,另外一個進(jìn)程從管道讀取信息
58、匿名管道
匿名管道是基于字符和半雙工的,一般用于程序輸入輸出的重定向。如果需要獲取一個基于控制臺窗口應(yīng)用程序的輸出,此時就可以是用匿名管道,首先使用CreatePipe函數(shù)創(chuàng)建匿名管道。
59、命名管道的特征:
命名管道是雙向的,進(jìn)程間可以使用同一管道進(jìn)行交互
命名管道不但可以面向字節(jié)流,還可以面向消息。所以讀取進(jìn)行可以讀取寫進(jìn)程發(fā)送的不同長度的消息
多個獨(dú)立的管道實例可以用同一個名稱來命名。
命名管道可以用于網(wǎng)絡(luò)間兩個進(jìn)程的通信,而其實現(xiàn)過程與本地進(jìn)程通信完全一致
60、創(chuàng)建命名管道使用CreateNamedPipe函數(shù)
61、郵槽是實現(xiàn)單通道的進(jìn)程間通信的通信方式。創(chuàng)建郵槽的進(jìn)程稱為郵槽服務(wù)器,向郵槽發(fā)送消息的進(jìn)程稱為郵槽客戶端
60、創(chuàng)建郵槽使用CreateMailslot函數(shù)
61、windows剪貼板是一種比較簡單同時也是開銷比較小的進(jìn)程間通信方式。
62、剪貼板通信機(jī)制
windows系統(tǒng)支持剪貼板IPC的基本機(jī)制室友系統(tǒng)預(yù)留的一塊全局共享內(nèi)存,可用于被各個進(jìn)程暫時存儲數(shù)據(jù)。寫入進(jìn)程首先穿件一個全局內(nèi)存塊,并將數(shù)據(jù)寫到該內(nèi)存塊;接受數(shù)據(jù)的進(jìn)程通過剪貼板機(jī)制獲取此內(nèi)存塊的句柄,并完成對該內(nèi)存塊數(shù)據(jù)的讀取。
63、剪貼板通信有5種基本情況:
文本剪貼板
位圖剪貼板
自定義格式
延遲提交
多項數(shù)據(jù)
63、進(jìn)程同步可分為兩大類:
訪問共享資源,多個進(jìn)程訪問進(jìn)程共享資源時,需要確保資源不受破壞。
事件通知,一個線程完成某項任務(wù)后通知其他線程。
64、原子訪問,是指線程對共享資源的獨(dú)占式訪問。
65、關(guān)鍵代碼段,是指在執(zhí)行前首先去的對共享資源的訪問權(quán),然后讓代碼以原子操作方式執(zhí)行來訪問共享資源的一種方法。
66、內(nèi)核對象等待函數(shù),其所等待的也正是內(nèi)核對象的受信狀態(tài)。
67、內(nèi)核對象本質(zhì)上只是一個內(nèi)存塊。
68、內(nèi)核對象是操作系統(tǒng)對資源進(jìn)行管理的單位。
69、內(nèi)核對象有兩種狀態(tài):已通知狀態(tài)、未通知狀態(tài)
70、在所有內(nèi)核對象中,事件內(nèi)核對象是最基本的對象,事件內(nèi)核對象有兩種狀態(tài):已通知狀態(tài)、未通知狀態(tài)。在多線程環(huán)境先經(jīng)常使用事件內(nèi)核對象的這種特性實現(xiàn)線程同步。
71、事件內(nèi)核對象有兩種基本類型:手動重置事件、自動重置事件。
72、等待定時器內(nèi)核對象是可以在某個指定時間或者以規(guī)定的間隔發(fā)出通知信號的內(nèi)核對象,一般在某個線程需要定時執(zhí)行某項功能時用這種內(nèi)核對項
73、信標(biāo)內(nèi)核對項常用于在多線程環(huán)境下控制某類資源的使用,使用信標(biāo)內(nèi)核對象可以讓系統(tǒng)自動地維護(hù)資源的數(shù)量,并合理的控制線程對資源的訪問情況。
74、信標(biāo)的出色之處在于它們能夠以原子操作方式來執(zhí)行測試和設(shè)置操作,當(dāng)向信標(biāo)申請一個資源時,操作系統(tǒng)就要檢驗是否有這個資源可供使用,同時將可用資源的數(shù)量遞減,而不讓另一個線程加以干擾。只有當(dāng)資源數(shù)量遞減后,系統(tǒng)才允許另一個線程申請對資源的訪問權(quán)。
75、如果線程需要訪問該資源就要先獲取互斥對象,所有線程都應(yīng)遵循這個規(guī)則。
76、動態(tài)鏈接庫(DLL)是Windows操作系統(tǒng)的基礎(chǔ),所有API函數(shù)都包含在DLL中。應(yīng)用程序并不是只有一個可執(zhí)行程序,而是由一個可執(zhí)行模塊和若干個DLL模塊組成。當(dāng)執(zhí)行應(yīng)用程序時,系統(tǒng)會把與可執(zhí)行模塊相鏈接的DLL模塊加載到當(dāng)前進(jìn)程地址空間。
77、動態(tài)鏈接庫(DLL)的最大特性是支持動態(tài)載入。
78、要產(chǎn)生可執(zhí)行文件有兩個步驟:
1)編譯過程。編譯源碼,為每個C/C++源文件生成一個.obj模塊,由編譯器完成。
2)鏈接過程。把應(yīng)用程序的各個.obj模塊鏈接起來產(chǎn)生.exe文件,有鏈接器完成。
79、DLL隱式鏈接,是指在鏈接過程中,把應(yīng)用程序所需要DLL模塊的名字和輸入符號都記錄下來,使得應(yīng)用程序在運(yùn)行時可以動態(tài)載入該DLL。
80、與隱式鏈接相比,顯示加載DLL主要有以下幾個特性:
1)顯示加載的DLL并不會在應(yīng)用程序初始化時就加載,而是在運(yùn)行時根據(jù)需要調(diào)用LoadLibrary或LoadLibraryEx函數(shù)來加載。
2)在應(yīng)用程序輸入表中沒有記錄。
3)隱式鏈接的前提是需要有DLL所對應(yīng)的lib文件,如果沒有l(wèi)ib文件就無法進(jìn)行隱式鏈接。顯示加載就沒有這個限制。
81、DllMain函數(shù)是DLL的可選入口。
82、線程本地存儲器(TLS)的主要作用是可以避免多個線程同時訪問同一全局或者靜態(tài)變量時導(dǎo)致的沖突。
83、TLS有兩種使用方法:靜態(tài)TLS和動態(tài)TLS。
84、結(jié)構(gòu)異常處理有三種基本的使用方法,分別是結(jié)束異常程序、異常處理程序和頂層異常處理。
85結(jié)構(gòu)化異常處理(SEH)是被作為一種系統(tǒng)機(jī)制引入到操作系統(tǒng)中的。
86、可執(zhí)行文件格式(PE),其格式中得分?jǐn)?shù)據(jù)結(jié)構(gòu)通常定義在winnt.h中。
第四篇:windows實驗一
(1)在“student1”文件夾下建立一個名為“課題組”的文件夾,并于此文件夾下新建下列子文件夾:
“個人簡介、我的論文、教改成果、教學(xué)資源、資料”;在文件夾“教學(xué)資源”下新建子文件夾:“圖片、課件、教案”;在文件夾“資料”中新建文件夾:“文本文件類、壓縮文件類”。
(2)在“student1”文件夾中新建word文件,文件名為“文學(xué)作品.doc”,將該文件的屬性設(shè)置為隱藏。
(3)設(shè)置最后一個硬盤盤所有文件和文件夾的顯示方式為:顯示隱藏文件,不隱藏已知文件的類型的擴(kuò)展名。
(4)設(shè)置文件夾“student1”的顯示方式為詳細(xì)信息。
(5)查找系統(tǒng)提供的應(yīng)用程序calc.exe,并在桌面上建立其快捷方式,快捷方式命名為“計算器”
(6)將子文件夾“dos”中的含有“X”字母的文件移動到“student1課題組教改成果”文件夾中。
(7)用附件——畫圖 畫一個藍(lán)色的三角形,并保存為擴(kuò)展名為PNG的文件,放到圖片文件夾。
(8)在“個人簡介“文件夾中,創(chuàng)建一記事本文件,文件名”個人簡介“,內(nèi)容:學(xué)號,姓名,性別,愛好等,并將文件屬性設(shè)置為只讀,存檔。
(9)將“開始”菜單“所有程序附件”中的記事本程序鎖定到任務(wù)欄
(10)搜索一張關(guān)于“薰衣草”的圖片,并將該圖片設(shè)置為自己的桌面,隱藏任務(wù)欄,將桌面截圖,截圖文件名為“桌面”并保存在“student1教學(xué)資源圖片”文件夾中。
(11)搜索c盤中的壓縮文件,并將找到的文件復(fù)制到文件夾“student1資料壓縮文件類”中。
(12)查找C盤上擴(kuò)展名為.gif,文件大小在10KB—100KB的文件。選擇2個拷貝到文件夾“student1win”中。
(13)刪除文件夾“student1”中的子文件夾“l(fā)inux”。
(14)使用計算器選擇“科學(xué)型”和“程序員型”,將計算結(jié)果寫在記事本中,并以“計算結(jié)果”為名保存到student1文件夾中。
(a)計算十進(jìn)制數(shù)2013,用二進(jìn)制、八進(jìn)制、十六進(jìn)制各表示為多少?
(b)換算:100加侖等于多少立方米?100磅等于多少千克?
(c)日期計算:從今天到2013年12月31日還有多少天?
(15)將文件夾“student1”移入張三文件夾,再將張三文件夾改為自己的學(xué)號+姓名。
將自己的文件夾壓縮,并把壓縮文件上傳到老師指定地址。
第五篇:2《地圖學(xué)》實驗指導(dǎo)
《地圖學(xué)》實驗指導(dǎo)書
1.墨卡托投影圖上等角航線與大圓航線繪制
1.1目的要求:
掌握正軸圓柱投影經(jīng)緯網(wǎng)建立的方法,并通過在該投影圖上繪制等角航線與大圓航線,加深對墨卡托投影性質(zhì)的理解 1.2實習(xí)步驟提要:
1.2.1墨卡托投影經(jīng)緯網(wǎng)的建立方法(1)計算赤道周長:
(2)計算各條經(jīng)緯線的平面直角坐標(biāo):
(3)在墨卡托投影上根據(jù)需要規(guī)定本初子午線位置,轉(zhuǎn)繪世界大陸輪廓線 1.2.2繪制等角航線與大圓航線的方法(1)繪制等角航線
(2)在圖紙上繪制區(qū)域范圍為
?N30?~?N90?,?E90?~?W90?;中央經(jīng)線λ0=180o,???10?、???10?的正軸球心方位投影經(jīng)緯網(wǎng)
1.2.3整飾圖名、比例尺、大洲名注記、經(jīng)緯度注記,繪內(nèi)外圖廓 1.3儀器用品:
直尺、分規(guī)、繪圖工具、圖紙、鉛筆、《世界地圖》;計算機(jī)、制圖軟件
2.地圖投影的判別
2.1目的要求
1、鞏固學(xué)過的地圖投影知識
2、掌握識別地圖投影系統(tǒng)和分析地圖投影變形性質(zhì)的方法
3、為正確使用地圖投影奠定基礎(chǔ) 2.2實習(xí)步驟提要
(1)利用在說明中介紹的方法,觀察地圖經(jīng)緯線形狀特征,判別地圖的投影系統(tǒng)
(2)觀察制圖區(qū)域位置、大小、形狀,分析判別地圖投影時投影面是與球面相切或相割關(guān)系。
(3)量測中央經(jīng)線上的緯線間間隔變化規(guī)律,確定投影的變形性質(zhì)
(4)仍然無法判別其地圖投影的變形性質(zhì)時,則應(yīng)采取量測計算圖上經(jīng)緯線交點的m,n,ε的方法,求算各經(jīng)緯線交點上的面積比(P)和最大角度變形(ω)2.3儀器用品:
兩腳規(guī)、三角板、鉛筆
3.地形圖分幅編號
3.1目的要求:
1、通過具體圖幅編號的計算,掌握基本比例尺地形圖的分幅和編號的方法
2、已知某地的地理坐標(biāo)為??27?56'(N),??112?46'(E)。用圖解法和解析法分別推算出該點所在的1:50萬、1:5萬、1:1萬地形圖的分幅和編號
3.2實習(xí)步驟提要: 3.2.1圖解法
(1)根據(jù)地理坐標(biāo),求其所在的1:100萬比例尺地形圖的圖號
(2)以經(jīng)差???30',緯差???20',將1:100萬圖幅劃分為縱向12列,橫向12行,即144幅1:10萬的圖幅,再以該地的經(jīng)緯度確定1:10萬圖幅的序號
(3)以經(jīng)差???15',緯差???10',將該地所在的1:10萬圖幅分成縱向2列,橫向2行,共4幅1:5萬的圖幅,再以該地的經(jīng)緯度確定1:5萬圖幅的序號
(4)以經(jīng)差???3'45'',緯差???2'30''將該地所在的1:10萬圖幅劃分成縱向8列,橫向8行,計64幅1:1萬的圖幅,再以該地的經(jīng)緯度確定1:1萬圖幅的序號 3.2.2解析法
解析法是建立在圖解基礎(chǔ)上的另一種推算地形圖分幅編號的方法。
(1)根據(jù)某地的地理坐標(biāo),求其所在的1:100萬地形圖圖號的列數(shù)和行數(shù),得1:100萬圖幅的圖號。
(2)用求1:100萬圖號列數(shù)和行數(shù)時剩下的余緯、余經(jīng)數(shù)值分別除以1:10萬圖幅的緯差和經(jīng)差,得該地所在地1:10萬圖幅在1:100萬圖幅內(nèi)所處地某一列數(shù)和行數(shù),便求得1:10萬圖幅的序號,若余緯或余經(jīng)小于緯差和經(jīng)差,則商均取1(以下同)
(3)用求1:10萬圖號列數(shù)和行數(shù)時剩下的余緯、余經(jīng)數(shù)值分別除以1:5萬圖幅的緯差和經(jīng)差,得該地所在的1:5萬圖幅在1:10萬圖幅內(nèi)所處的某一列數(shù)和行數(shù),則得1:5萬圖幅得序號
(4)用求1:10萬圖號列數(shù)和行數(shù)時剩下的余緯、余經(jīng)數(shù)值分別除1:1萬圖幅的緯差和經(jīng)差,得該地所在的1:1萬圖幅在1:10萬圖幅內(nèi)所處的某一列數(shù)和行數(shù),則得1:1萬圖幅的序號
(5)依圖號構(gòu)成的方式,寫出各比例尺地形圖相應(yīng)的圖號
4.地形圖閱讀
4.1目的要求:
選擇一幅內(nèi)容要素比較全面,低山丘陵地區(qū)的1:5萬地形圖進(jìn)行閱讀,并寫出閱讀報告,以理解地圖所表示諸要素的內(nèi)容,建立符號與表示對象的聯(lián)系,加深對地圖特點的認(rèn)識。4.2實習(xí)步驟提要:
1、閱讀輔助要素
2、閱讀數(shù)學(xué)要素
3、閱讀圖形要素
4.3儀器用品:直尺,兩腳規(guī)
5.地形圖坐標(biāo)、長度、坡度量算
5.1目的要求
(1)量測大比例尺地形圖上若干指定地面點的平面直角坐標(biāo)和地理坐標(biāo)(2)量測大比例尺地形圖上若干地物點間的直線長度和曲線長度(3)量測大比例尺地形圖上若干指定方向的等高線之間的坡度
(4)通過具體量測,掌握運(yùn)用手工方法及計算機(jī)方法在地形圖上進(jìn)行量算的基本技能,為正確應(yīng)用地圖打下基礎(chǔ) 5.2實習(xí)步驟提要
(1)量測平面直角坐標(biāo)(2)量測地理坐標(biāo)(3)量測長度(4)量測坡度
(5)用計算機(jī)進(jìn)行地形圖量算
5.3儀器用品:直尺,三角板,兩腳規(guī),曲線量測儀,計算器;計算機(jī),制圖軟件
6.地形圖面積量算
6.1目的要求:
(1)在地形圖上進(jìn)行匯水面積界限的勾繪
(2)通過各種方法的應(yīng)用,掌握在地形圖上進(jìn)行面積量測的方法,并比較各種方法的優(yōu)缺點及精度
6.2實習(xí)步驟提要:
(1)用方格法或、平行線法、求積儀法、計算機(jī)法求算面積(2)匯水界限勾繪
6.3儀器用品:透明坐標(biāo)紙,聚酯薄膜,直尺,三角板,求積儀,計算器;計算機(jī),制圖軟件
7.地形圖體積量算
7.1目的要求:
由教師在指定的大比例尺地形圖上,計算幾條等高線所組成山體的體積,以掌握在地形圖上量測體積的方法
7.2實習(xí)步驟提要(以等高線法為例)
(1)固定地形圖于圖板上,使圖面保持平整
2(2)采用地形圖上量測面積的任何方法,量算出各層等高線圖內(nèi)的實地面積Si(m)(3)計算體積
7.3儀器用品:厘米方格紙(透明),計算器,求積儀;計算機(jī),制圖軟件
8.教學(xué)掛圖編繪(地理科學(xué)專業(yè)用)8.1目的要求:
通過編繪教學(xué)掛圖,初步掌握教學(xué)掛圖編繪的過程和方法。8.2實習(xí)步驟提要:(1)資料的搜集與處理
根據(jù)掛圖的需要,搜集有關(guān)的地圖和文字資料,并確定各種資料的使用程度和處理方法。(2)地圖設(shè)計
確定用什么方法表示專題現(xiàn)象,數(shù)量表示的分等分級,設(shè)計表示專題現(xiàn)象的符號圖形、大小和顏色,安排圖名、比例尺、地圖投影、圖例表、各種要素的注記等。(3)繪制底圖
根據(jù)專題內(nèi)容的需要,選擇或確定一種地圖作為底圖,并采用網(wǎng)格法或縮放儀法將其放大轉(zhuǎn)繪至所需要的比例尺。(4)編繪專題內(nèi)容
根據(jù)設(shè)計確定的表示方法和圖形符號,繪制表示專題內(nèi)容的各種圖形符號。(5)圖面整飾
根據(jù)設(shè)計要求對原稿圖著色,精確繪制各種符號,寫注記,配置圖面,繪圖廓,最后檢查。
8.3儀器用品:縮放儀、長直尺、繪圖紙、顏料、繪圖工具等。
(李曉華于2006年8月修訂)