Windows的圖形設備接口及windows繪圖課件_第1頁
Windows的圖形設備接口及windows繪圖課件_第2頁
Windows的圖形設備接口及windows繪圖課件_第3頁
Windows的圖形設備接口及windows繪圖課件_第4頁
Windows的圖形設備接口及windows繪圖課件_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Windows的圖形設備接口及windows繪圖Windows圖形設備接口(GDI)是為與設備無關的圖形設計的。所謂設備的無關性,就是操作系統(tǒng)屏蔽了硬件設備的差異,因而設備無關性能使用戶編程時無需考慮特殊的硬件設置一、圖形設備按口(GDI)GDI負責系統(tǒng)與用戶或繪圖程序之間的信息交換,并控制在輸出設備上顯示圖形或文字,是Windows系統(tǒng)的重要組成部分Windows支持與設備無關的圖形利用GDI和Windows設備驅動程序開發(fā)人員只要建立與輸出設備的關聯(lián),讓系統(tǒng)加載相應的設備驅動程序即可1.GDI的一些基本概念

設備描述表即為設備環(huán)境的屬性的集合應用程序與輸出設備之間的橋梁Win系統(tǒng)外設直接訪問不允許統(tǒng)一的設備環(huán)境(DC)提供使應用程序與設備相連用戶為確保圖形輸出的設備無關性應用程序設備描述表及其屬性通過設備描述表的句柄來間接地存取應用程序每一次圖形操作均參照設備描述表中的屬性執(zhí)行2.圖形刷新圖形刷新是繪圖過程中必須考慮的重要問題刷新請求對刷新請求的響應刷新方法包括(1)刷新請求

應用程序在窗口中繪制了一個橢圓,顏色列表框覆蓋了橢圓的一部分關閉顏色選框后,應用程序需要恢復被覆蓋部分的顏色和形狀窗口大小的調(diào)整窗口移動被覆蓋后的恢復(2)系統(tǒng)對刷新請求的響應

當用戶區(qū)的內(nèi)容需要刷新時,系統(tǒng)向應用程序消息隊列發(fā)送WM_PAINT消息,系統(tǒng)在應用程序的消息隊列中加入該消息,以通知窗口函數(shù)執(zhí)行刷新處理三種刷新窗口移動后的刷新被覆蓋區(qū)域的刷新對象穿越后的刷新(系統(tǒng)自動完成)用戶區(qū)移動或顯示用戶窗口大小改變程序通過滾動條滾動窗口窗口被另一個窗口覆蓋的恢復如下拉式菜單關閉等光標穿過用戶區(qū)圖標拖過用戶區(qū)窗口被另一個窗口覆蓋的區(qū)域稱為無效區(qū)域。系統(tǒng)為每個窗口建立了一個PAINTSTRUCT結構,該結構中包含了包圍無效區(qū)域的一個最小矩形的結構RECT,應用程序可以根據(jù)這個無效矩形執(zhí)行刷新操作。

TypedefstructtagPAINTSTRUCT{HDChdc; //設備環(huán)境句柄

BOOLfErase; //一般取真值,表示擦除無效矩形的背景

RECTrcPaint; //無效矩形標識

BOOLfRestore; //系統(tǒng)保留

BOOLfIncUpdate; //系統(tǒng)保留

BYTErgbReserved[16];//系統(tǒng)保留

}PAINTSTRUCT;rcPaint

為標準的RECT數(shù)據(jù)結構,其作用是標識無效矩形,它包含了無效矩形的左上角和右下角的坐標常用的Windows應用程序刷新窗口的方法保存副本。刷新時將副本拷貝到相應的窗口中記錄事件。刷新時重新執(zhí)行這個曾經(jīng)發(fā)生的事件重新繪制。將圖形繪制處理程序放在消息WM_PAINT響應模塊中,刷新時重繪圖形(3)有效的刷新方法3.獲取設備環(huán)境的方法獲取設備環(huán)境是應用程序輸出圖形的先決條件,常用的兩種方法是調(diào)用函數(shù)BeginPaint或GetDC(1)調(diào)用BeginPaint函數(shù)

應用程序響應WM_PAINT消息進行圖形刷新時,主要通過調(diào)用BeginPaint函數(shù)獲取設備環(huán)境

hdc=BeginPaint(hwnd,&ps);//ps為PAINTSTRUCT類型結構定義方式為:PAINTSTRUCTps;

系統(tǒng)獲取設備環(huán)境的同時填寫ps結構,以標識無效矩形區(qū)由BeginPaint函數(shù)獲取的設備環(huán)境要用EndPaint函數(shù)釋放voidEndPaint(HWND

hwnd,PAINTSTRUCT&ps)(2)調(diào)用GetDC函數(shù)

如果繪圖工作并非由WM_PAINT消息驅動,則調(diào)用GetDC函數(shù)獲取設備環(huán)境。hdc=GetDC(hwnd);

由GetDC函數(shù)獲取的設備環(huán)境必須用ReleaseDC函數(shù)釋放

voidReleaseDC(HWND

hwnd);4.映像模式 映像模式定義了將邏輯單位轉化為設備的度量單位以及設備的x方向和y方向,程序員可在一個統(tǒng)一的邏輯坐標系中操作而不必考慮輸出設備的坐標系情況窗口:對應邏輯坐標系上程序員設定的區(qū)域視口:對應實際輸出設備上程序員設定的區(qū)域窗口和視口如何映射?缺省的映射模式將窗口中的對稱圖形映射到視口時仍為對稱圖形按照窗口和視口的坐標比例進行映射坐標系統(tǒng)邏輯坐標系統(tǒng)設備坐標系統(tǒng)屏幕坐標系統(tǒng)窗口坐標系統(tǒng)用戶區(qū)坐標系統(tǒng)

應用程序可獲取設備環(huán)境的當前映像模式,并根據(jù)需要設置映像模式。相關函數(shù)設置設備環(huán)境的映像模式SetMapMode(hdc,nMapMode);

nMapMode為映像模式的整型標識符獲取當前設備環(huán)境的映像模式nMapMode=GetMapMode(hdc);窗口區(qū)域的定義由SetWindowExtEx函數(shù)完成,其函數(shù)原型形為:BOOLSetWindowExtEx(HDChdc,

int

nHeight,nWidth,//以邏輯單位表示的窗口區(qū)域高寬度

LPSIZElpSize,//函數(shù)調(diào)用前窗口區(qū)域尺寸的SIZE結構地址);視口區(qū)域的定義由SetViewportExtEx函數(shù)完成,函數(shù)原型為:BOOLSet

ViewportExtEx(HDChdc, intnHeight,nWidth,//以物理設備單位表示的新視口區(qū)域高寬度LPSIZElpSize

);只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時才有意義視口的缺省原點和窗口的缺省原點均為(0,0)??赏ㄟ^調(diào)用函數(shù)SetViewportOrgEx和SetWindowOrgEx設定窗口與視口的原點。SetWindowOrgEx函數(shù)的原形為:BOOLSetWindowOrgEx(HDChdc,intX,Y, //以邏輯單位表示的窗口原點坐標LPPOINTlpPoint //函數(shù)調(diào)用前原點坐標的POINT結構的地址);只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時才有意義15MM_TEXT映射方式假設顯示區(qū)域為cxClient個像素寬和cyClient個像素高。如果想將邏輯點(0,0)定義為顯示區(qū)域的中心,調(diào)用SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL)SetViewportOrgEx的參數(shù)總是使用設備單位?,F(xiàn)在,邏輯點(0,0)將映射為設備點(cxClient/2,cyClient/2),而顯示區(qū)域的座標系變成如下形狀:17用下面的SetWindowOrgEx敘述可以獲得與上面使用SetViewportOrgEx同樣的效果:SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);SetWindowOrgEx的參數(shù)總是使用邏輯單位。在這個調(diào)用之后,邏輯點(-cxClient/2,-cyClient/2)映射為設備點(0,0),即顯示區(qū)域的左上角。二、繪圖工具與顏色1.畫筆(1)畫筆的創(chuàng)建使用畫筆之前必須事先定義一個畫筆句柄。形式如下:HPENhP;然后調(diào)用函數(shù)GetStockObject獲取Windows系統(tǒng)定義的四種畫筆例如獲取畫筆BLACK_PEN的形式如下:

hP=GetStockObject(BLACK_PEN);WHITE_PENBLACK_PENNULL_PEN畫筆的操作創(chuàng)建畫筆將畫筆選入設備環(huán)境刪除畫筆(2)創(chuàng)建新畫筆,形式如下:hP=CreatePen(intnPenStyle, //確定畫筆樣式intnWidth, //畫筆寬度COLORREFrgbColor//畫筆顏色);創(chuàng)建畫筆后,必須調(diào)用SelectObject函數(shù)將其選入設備環(huán)境。

SelectObject(hdc,hP);//hP為所創(chuàng)建或獲取的畫筆句柄不再使用當前畫筆時,需刪除畫筆,以免占內(nèi)存

DeleteObject(hP);PS_DASH: 虛線 PS_DASHDOT: 點劃線 PS_DASHDOTDOT:雙點劃線PS_DOT: 點線 PS_INSIDEFRAME: 實線PS_NULL: 無 PS_SOLID: 實線2.畫刷畫刷的創(chuàng)建與應用與畫筆很相似,操作畫刷也包括創(chuàng)建、選入設備環(huán)境和刪除。(1)畫刷的創(chuàng)建使用畫刷需事先定義一個畫刷句柄。形式如下:

HBRUSHhBr;//hBr為畫刷句柄

然后調(diào)用函數(shù)GetStockObject獲取Windows系統(tǒng)提供的7種畫刷

hBr=(HBRUSH)GetStockObject(nBrushStyle)畫刷樣式BLACK_BRUSH 黑色畫刷DKGRAY_BRUSH 深灰色畫刷GRAY_BRUSH 灰色畫刷HOLLOW_BRUSH 虛畫刷LTGRAY_BRUSH 亮灰色畫刷NULL_BRUSH 空畫刷 WHITE_BRUSH 白色畫刷指定顏色畫刷如何獲得?可調(diào)用函數(shù)CreateSolidBrush和CreateHatchBrush創(chuàng)建畫刷,hBr=CreateSolidBrush(rgbColor);

創(chuàng)建具有指定顏色的單色畫刷創(chuàng)建指定陰影圖案和顏色的畫刷(2)選入設備環(huán)境

創(chuàng)建畫刷后,通過SelectObject(hdc,hBr);將其選入設備環(huán)境(3)刪除畫刷不使用畫刷時,可用DeleteObject(hBr);刪除畫刷,釋放內(nèi)存hBr=CreateHatchBrush(int

nHctchStyle,COLORREFrgbColor

);HS_BDIAGONAL45度從左上到右下HS_DIAGCROSS45度叉線 HS_FDIAGONAL45度從左下到右上HS_CROSS 垂直相交的陰影線HS_HORIZONTAL水平陰影線HS_VERTICAL 垂直陰影線3.顏色

Windows使用宏RGB定義繪圖的顏色,其形式為:

RGB(nRed,nGreen,nBlue)

紅色值藍色值綠色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)三、常用繪圖函數(shù)1.設置畫筆當前位置的函數(shù)MoveToEx,

BOOLMoveToEx(HDChdc,

intX,Y, //X、Y分別為新位置的邏輯坐標

LPPOINTlpPoint //存放原畫筆位置的POINT結構地址)2.從當前位置向指定坐標點畫直線的函數(shù)LineTo,BOOLLineTo

(HDChdc,intX,intY)//X和Y為線段的終點坐標3.從當前位置開始,依次用線段連接lpPoints中指定的各點BOOLPolyline(HDChdc,LPPOINTlpPoints,//指向包含各點坐標的POINT結構數(shù)組的指針

int

nCount //nCount為POINT數(shù)組中點的個數(shù))4.繪制橢圓弧線的函數(shù)Arc,BOOLArc(HDChdc,intX1,intY1, //邊框矩形左上角的邏輯坐標intX2,intY2, //邊框矩形右下角的邏輯坐標intX3,intY3, //橢圓弧起始點坐標intX4,intY4 //橢圓弧終止點坐標)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所畫曲線5.繪制餅圖,并用當前畫刷進行填充BOOLPie(HDChdc,intX1,intY1, //邊框矩形左上角的邏輯坐標intX2,intY2, //邊框矩形右下角的邏輯坐標intX3,intY3, //橢圓弧起始經(jīng)線的確定點坐標intX4,intY4 //橢圓弧終止經(jīng)線的確定點坐標)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所填區(qū)域6.繪制矩形,并用當前畫刷進行填充BOOLRectangle(HDChdc,intX1,intY1,intX2,intY2)(X1,Y1)和(X2,Y2)分別為矩形的左上角和右下角的邏輯坐標7.繪制圓角矩形,并用當前畫刷填充BOOLRoundRect(HDChdc,intX1,intY1,intX2,intY2,

int

nHeight,int

nWidth)圓角的高度和寬度8.繪制橢圓,并用當前畫刷填充

BOOLEllipse(HDChdc,intX1,intY1,intX2,intY2)9.繪制多邊形,并用當前畫刷填充

BOOLPolygon(HDChdc,LPPOINT

lpPoints,int

nCount)包含各點坐標的POINT數(shù)組的地址多邊形點的個數(shù)2728四、應用實例【例3-1】利用繪圖函數(shù)創(chuàng)建填充區(qū)。共有三個填充圖形,第一個是用深灰色畫刷填充帶圓角的矩形,第二個是采用亮灰色畫刷填充一個橢圓型圖,第三個是用虛畫刷填充餅形圖。#include<windows.h>longWINAPIWndProc ( HWNDhWnd, UINTiMessage, UINTwParam, LONGlParam );使用虛畫刷填充時,看不出填充效果!!!BOOLInitWindowsClass(HINSTANCE

hInstance);BOOLInitWindows(HINSTANCE

hInstance,int

nCmdShow);HWNDhWndMainintWINAPIWinMain //主函數(shù)

(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine,

int

nCmdShow){ MSGMessage;

if(!InitWindowsClass(hInstance)) returnFALSE;

if(!InitWindows(hInstance,nCmdShow)) returnFALSE;

while(GetMessage(&Message,0,0,0)) //消息循環(huán)

{

TranslateMessage(&Message);

DispatchMessage(&Message); } returnMessage.wParam;}longWINAPIWndProc(HWND

hWnd,UINT

iMessage, UINTwParam,LONG

lParam){HDChDC; //定義指向設備的句柄

HBRUSHhBrush; //定義指向畫刷的句柄

HPENhPen; //定義指向畫筆的句柄

PAINTSTRUCTPtStr;//定義指向包含繪圖信息的結構體變量消息處理函數(shù)switch(iMessage) //處理消息{caseWM_PAINT:

//處理繪圖消息

hDC=BeginPaint(hWnd,&PtStr);

SetMapMode(hDC,MM_ANISOTROPIC);//設置映像模式

hPen=(HPEN)GetStockObject(BLACK_PEN); //黑色畫筆

hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//畫刷

SelectObject(hDC,hBrush);//選擇畫刷

SelectObject(hDC,hPen);//選擇畫筆

RoundRect(hDC,50,120,100,200,15,15);//繪制圓角矩形

hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//采用亮灰色畫刷下面只改變畫刷,不改變筆

SelectObject(hDC,hBrush); //選擇畫刷

Ellipse(hDC,150,50,200,150); //繪制橢圓

hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);//虛畫刷

SelectObject(hDC,hBrush); //選擇畫刷

Pie(hDC,250,50,300,100,250,50,300,50); //繪制餅形

EndPaint(hWnd,&PtStr); //結束繪圖

return0;caseWM_DESTROY:

//結束應用程序

PostQuitMessage(0);return0;default: //其他消息處理程序

return(DefWindowProc(hWnd,iMessage,wParam,lParam));}}BOOLInitWindows(HINSTANCE

hInstance,int

nCmdShow)//初始化窗口{ HWNDhWnd;

hWnd=CreateWindow("WinFill",//生成窗口

"填充示例程序", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL,

hInstance, NULL);

if(!hWnd) returnFALSE;

hWndMain=hWnd;

ShowWindow(hWnd,nCmdShow); //顯示窗口

UpdateWindow(hWnd); returnTRUE;}BOOLInitWindowsClass(HINSTANCE

hInstance) //定義窗口類{WNDCLASSWndClass;

WndClass.cbClsExtra=0;

WndClass.cbWndExtra=0;

WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));

WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);

WndClass.hIcon=LoadIcon(NULL,"END");

WndClass.hInstance=hInstance;

WndClass.lpfnWndProc=WndProc;

WndClass.lpszClassName="WinFill";

WndClass.lpszMenuName=NULL;

WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}【例4-3】繪圖與刷新。制訂一種重新繪制圖形的刷新方式,將圖形繪制模塊放在消息WM_PAINT的處理過程中,當窗口需要刷新時,通知窗口函數(shù)重新繪制圖形以完成刷新工作。本例要求先使用畫筆和畫刷繪制一個矩形,然后使用紅色網(wǎng)格繪制一個橢圓,再使用綠色點劃線繪制橢圓的軸線。#include<windows.h>LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCE

hInstance,HINSTANCEhPrevInst, LPSTRlpszCmdLine, int

nCmdShow){HWNDhwnd; MSGMsg; WNDCLASSwndclass;charlpszClassName[]="基本繪圖";charlpszTitle[]="My_Drawing";

wndclass.style=0;…… //填寫屬性

wndclass.lpszClassName=lpszClassName;if(!RegisterClass(&wndclass)) {MessageBeep(0);returnFALSE;}hwnd=CreateWindow(…,………,…);ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd);while(GetMessage(&Msg,NULL,0,0)) {TranslateMessage(&Msg);DispatchMessage(&Msg);}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論