版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1程序設(shè)計(jì)實(shí)踐
Windows編程基礎(chǔ)知識2繪圖程序設(shè)計(jì)內(nèi)容提要1項(xiàng)目分析和設(shè)計(jì)2基本的WINDOWS應(yīng)用程序3繪圖基礎(chǔ)知識4繪圖程序Draw的實(shí)現(xiàn)31項(xiàng)目分析和設(shè)計(jì)需求分析功能需求
能繪制由基本圖元(點(diǎn)、線、圓、橢圓、文字)組成的各種圖形或動(dòng)畫,可以響應(yīng)鼠標(biāo)事件(菜單項(xiàng))。界面要求
應(yīng)用程序提供用戶區(qū)供繪圖使用,用戶區(qū)可以顯示坐標(biāo)軸、原點(diǎn)等。41項(xiàng)目分析和設(shè)計(jì)界面設(shè)計(jì)
在界面上可設(shè)置菜單,布置菜單項(xiàng),按用戶需求完成特定繪圖功能,在繪圖客戶區(qū)可以顯示坐標(biāo)軸、原點(diǎn)等。51項(xiàng)目分析和設(shè)計(jì)總體設(shè)計(jì)軟件架構(gòu)
61項(xiàng)目分析和設(shè)計(jì)總體設(shè)計(jì)類關(guān)系圖
7繪圖程序設(shè)計(jì)內(nèi)容提要1項(xiàng)目分析和設(shè)計(jì)2基本的WINDOWS應(yīng)用程序3繪圖基礎(chǔ)知識4繪圖程序Draw的實(shí)現(xiàn)82基本的WINDOWS應(yīng)用程序基本的WINDOWS應(yīng)用程序例1:編寫一個(gè)簡單的windows程序,只有基本框架代碼,沒有具體功能。92基本的WINDOWS應(yīng)用程序例1:第一步:建立一個(gè)新的工程(1)啟動(dòng)VisualStudio,選擇菜單項(xiàng)“文件”點(diǎn)擊“新建---項(xiàng)目”,在彈出窗口中項(xiàng)目類型選擇“win32”,繼續(xù)選擇“win32項(xiàng)目”,為項(xiàng)目起名“Draw”。
102基本的WINDOWS應(yīng)用程序例1:第一步:建立一個(gè)新的工程(2)點(diǎn)擊“確定”后,在彈出窗口中進(jìn)行“應(yīng)用程序設(shè)置”,選擇“windows應(yīng)用程序”,選中“空項(xiàng)目”,然后點(diǎn)擊“完成”。
112基本的WINDOWS應(yīng)用程序例1:第二步:設(shè)置字符集(1)在生成的解決方案名稱上,單擊鼠標(biāo)右鍵,在彈出的菜單條上,選擇“屬性”122基本的WINDOWS應(yīng)用程序例1:第二步:設(shè)置字符集(2)在彈出的窗口中,選擇“配置屬性”=>“常規(guī)”點(diǎn)擊“字符集”右側(cè)下拉框選中“未設(shè)置”然后“確定”。132基本的WINDOWS應(yīng)用程序例1:第三步:為工程添加源文件/頭文件。包含頭文件:#include<cstdlib>#include"windows.h"usingnamespacestd;添加WinMain函數(shù)和窗口過程函數(shù)142基本的WINDOWS應(yīng)用程序例2,在例1基礎(chǔ)上添加菜單第一~三步同例1第四步:為工程添加資源文件。Windows資源可以是標(biāo)準(zhǔn)的,也可以是自定義的。標(biāo)準(zhǔn)資源中的數(shù)據(jù)描述了圖標(biāo)、光標(biāo)、菜單、對話框、位圖和加速鍵表等。應(yīng)用程序自定義的資源,則包含任何特定應(yīng)用程序需要的數(shù)據(jù)。152基本的WINDOWS應(yīng)用程序例2:第四步:為工程添加菜單//fig.rc#include"resource.h"http://MenuIDC_TEST2MENUBEGINPOPUP"&File“ //定義彈出式菜單BEGIN MENUITEM"時(shí)鐘", IDM_FIG1 MENUITEM"Fig2", IDM_FIG2 MENUITEM"E&xit", IDM_EXITENDEND菜單項(xiàng)標(biāo)識,在消息wParam中包含選中菜單項(xiàng)的標(biāo)識。每個(gè)菜單項(xiàng)的標(biāo)識必須唯一,標(biāo)識值常在頭文件中定義162基本的WINDOWS應(yīng)用程序例2:第四步:為工程添加頭文件資源文件。//Resource.h#defineIDM_FIG1 104#defineIDM_FIG2 105#defineIDM_EXIT 106#defineIDC_TEST2 109172基本的WINDOWS應(yīng)用程序例2,第五步:修改窗口類的定義lpszMenuName添加頭文件:#include"resource.h"wndclass.lpszMenuName=MAKEINTRESOURCE(IDC_TEST2);182基本的WINDOWS應(yīng)用程序例2,第六步:消息循環(huán)部分需要增加菜單命令消息處理192基本的WINDOWS應(yīng)用程序 caseWM_COMMAND: //處理菜單消息 wmId=LOWORD(wParam); //菜單項(xiàng)標(biāo)識 wmEvent=HIWORD(wParam); switch(wmId) {caseIDM_FIG1: menuId=IDM_FIG1;
InvalidateRect(hwnd,NULL,TRUE); break;
caseIDM_FIG2: menuId=IDM_FIG2; InvalidateRect(hwnd,NULL,TRUE); break;
caseIDM_EXIT: DestroyWindow(hwnd); break; } break;202基本的WINDOWS應(yīng)用程序InvalidateRect函數(shù)原型
BOOLInvalidateRect( HWNDhWnd,//要更新的客戶區(qū)所在的窗體的句柄 CONSTRECT*lpRect,//無效矩形區(qū)域 BOOLbErase//重畫標(biāo)志 );作用:該函數(shù)向指定的窗體更新區(qū)域添加一個(gè)矩形,然后窗口客戶區(qū)域的這一部分將被重新繪制,發(fā)送WM_PAINT消息。InvalidateRect(hwnd,NULL,TRUE);
NULL表示全部窗口區(qū)域21繪圖程序設(shè)計(jì)內(nèi)容提要1項(xiàng)目分析和設(shè)計(jì)2基本的WINDOWS應(yīng)用程序3繪圖基礎(chǔ)知識4繪圖程序Draw的實(shí)現(xiàn)223繪圖基礎(chǔ)知識圖形處理技術(shù)Windows圖形設(shè)備接口(GDI)
與設(shè)備無關(guān)的圖形設(shè)計(jì)的。即操作系統(tǒng)屏蔽了硬件設(shè)備的差異,使用戶編程時(shí)無需考慮特殊的硬件設(shè)置OpenGL技術(shù)
與硬件無關(guān)的三維圖形軟件接口,是一個(gè)提供3D圖形繪制及著色功能的API函數(shù)庫。DirectX技術(shù)
基于COM的一套軟件編程接口,它為基于windows平臺的應(yīng)用程序提供了圖像、音頻等組件233繪圖基礎(chǔ)知識圖形設(shè)備接口GDI設(shè)備描述表句柄(DeviceContext,DC)用于應(yīng)用程序和物理設(shè)備之間進(jìn)行交互,它是GDI的關(guān)鍵元素。設(shè)備描述表是一種數(shù)據(jù)結(jié)構(gòu),它包括了一個(gè)設(shè)備(如顯示器和打印機(jī))繪制屬性的相關(guān)信息。所有的繪制操作通過設(shè)備描述表進(jìn)行。應(yīng)用程序不能直接訪問設(shè)備描述表,只能由各種相關(guān)的API函數(shù)通過設(shè)備描述表句柄來間接訪問該結(jié)構(gòu)。
243繪圖基礎(chǔ)知識圖形設(shè)備接口GDI顯示器設(shè)備描述表,總是與某個(gè)窗口或這窗口上的某個(gè)顯示區(qū)域相關(guān)。
Windows窗口一旦創(chuàng)建,它就自動(dòng)地產(chǎn)生了與之相對應(yīng)的設(shè)備描述表數(shù)據(jù)結(jié)構(gòu),用戶可運(yùn)用該結(jié)構(gòu),實(shí)現(xiàn)對窗口顯示區(qū)域的GDI操作,如劃線、寫文本、繪制位圖、填充等,并且所有這些操作均要通過設(shè)備描述表句柄來進(jìn)行。253繪圖基礎(chǔ)知識圖形刷新是繪圖過程中必須考慮的重要問題刷新請求窗口大小的調(diào)整、窗口移動(dòng)、被覆蓋后的恢復(fù)……系統(tǒng)對刷新請求的響應(yīng)當(dāng)用戶區(qū)的內(nèi)容需要刷新時(shí),系統(tǒng)向應(yīng)用程序消息隊(duì)列發(fā)送WM_PAINT消息,系統(tǒng)在應(yīng)用程序的消息隊(duì)列中加入該消息,以通知窗口函數(shù)執(zhí)行刷新處理有效的刷新方法重新繪制。將圖形繪制處理程序放在消息WM_PAINT響應(yīng)模塊中,刷新時(shí)重繪圖形263繪圖基礎(chǔ)知識映射模式定義了將邏輯單位轉(zhuǎn)化為設(shè)備的度量單位以及設(shè)備的x方向和y方向程序員可在一個(gè)統(tǒng)一的邏輯坐標(biāo)系中操作而不必考慮輸出設(shè)備的坐標(biāo)系缺省的映像模式:MM_TEXT(1)將一個(gè)邏輯單位映射為:1個(gè)像素(2)坐標(biāo)系設(shè)定:X右,Y下(正方向)273繪圖基礎(chǔ)知識映射模式映像模式將一個(gè)邏輯單位映像為坐標(biāo)系設(shè)定MM_ANISOTROPIC系統(tǒng)確定可選MM_HIENGLISH英寸Y向上,X向右MM_HIMETRIC毫米Y向上,X向右MM_ISOTROPIC系統(tǒng)確定可選,但x軸和y軸的單位比例為1:1MM_LOENGLISH英寸Y向上,X向右MM_LOMETRIC毫米Y向上,X向右MM_TEXT一個(gè)像素Y向下,X向右MM_TWIPS英寸Y向上,X向右283繪圖基礎(chǔ)知識圖形設(shè)備接口GDI畫筆和畫刷是最重要的繪圖工具,而選用繪圖工具進(jìn)行繪圖操作的一般步驟是:(1)獲得設(shè)備環(huán)境句柄;(2)獲得繪圖工具;創(chuàng)建畫筆、畫刷將畫筆、畫刷選入設(shè)備環(huán)境不使用時(shí),刪除畫筆、畫刷293繪圖基礎(chǔ)知識繪圖操作的步驟1:獲得設(shè)備環(huán)境句柄;方法1:調(diào)用函數(shù)BeginPaint——WM_PAINT消息(1)應(yīng)用程序響應(yīng)WM_PAINT消息圖形刷新時(shí),調(diào)用BeginPaint函數(shù)獲取設(shè)備環(huán)境
hdc=BeginPaint(hwnd,&ps);// PAINTSTRUCTps;(2)必須用EndPaint函數(shù)釋放。方法2:調(diào)用函數(shù)GetDC(1)獲取設(shè)備環(huán)境:hdc=GetDC(hwnd);(2)釋放設(shè)備環(huán)境:ReleaseDC(hwnd);系統(tǒng)獲取設(shè)備環(huán)境的同時(shí)填寫ps結(jié)構(gòu),標(biāo)識無效矩形區(qū)303繪圖基礎(chǔ)知識繪圖操作的步驟1:獲得設(shè)備環(huán)境句柄;313繪圖基礎(chǔ)知識繪圖操作的步驟2:獲得繪圖工具畫筆(1)創(chuàng)建畫筆HPENhP;//定義畫筆句柄。hP=GetStockObject(BLACK_PEN);//獲取畫筆(2)將畫筆選入設(shè)備環(huán)境SelectObject(hdc,hP);//hP為所創(chuàng)建或獲取的畫筆句柄(3)刪除畫筆DeleteObject(hP);//不使用畫筆時(shí),需刪除,以免占內(nèi)存Windows系統(tǒng)定義的四種畫筆WHITE_PEN,BLACK_PEN,DC_PEN,NULL_PEN323繪圖基礎(chǔ)知識繪圖操作的步驟2:獲得繪圖工具(1)創(chuàng)建新畫筆hP=CreatePen(intnPenStyle, //確定畫筆樣式intnWidth, //畫筆寬度COLORREFrgbColor//畫筆顏色);PS_DASH: 虛線 PS_DASHDOT: 點(diǎn)劃線 PS_DASHDOTDOT: 雙點(diǎn)劃線PS_DOT: 點(diǎn)線 PS_INSIDEFRAME: 實(shí)線PS_NULL: 無 PS_SOLID: 實(shí)線333繪圖基礎(chǔ)知識繪圖操作的步驟2:獲得繪圖工具畫刷(1)創(chuàng)建畫刷HBRUSHhBr;//定義畫刷句柄。hBr=(HBRUSH)GetStockObject(nBrushStyle)//畫刷樣式(2)將畫刷選入設(shè)備環(huán)境SelectObject(hdc,hBr);//hBr為所創(chuàng)建或獲取的畫刷句柄(3)刪除畫刷DeleteObject(hBr);//不使用畫刷時(shí),需刪除,以免占內(nèi)存系統(tǒng)定義的七種畫刷BLACK_BRUSH 黑色畫刷DKGRAY_BRUSH 深灰色畫刷GRAY_BRUSH 灰色畫刷HOLLOW_BRUSH 虛畫刷LTGRAY_BRUSH 亮灰色畫刷NULL_BRUSH 空畫刷WHITE_BRUSH 白色畫刷343繪圖基礎(chǔ)知識繪圖操作的步驟2:獲得繪圖工具畫刷(1)創(chuàng)建新畫刷
調(diào)用CreateSolidBrush函數(shù)和CreateHatchBrush函數(shù) hBr=CreateSolidBrush(rgbColor);//rgbColor畫刷顏色
hBr=CreateHatchBrush( intnHctchStyle, COLORREFrgbColor );創(chuàng)建具有指定顏色的單色畫刷創(chuàng)建指定陰影圖案和顏色的畫刷陰影模式:HS_BDIAGONAL45度從左上到右下HS_DIAGCROSS45度叉線 HS_FDIAGONAL45度從左下到右上HS_CROSS 垂直相交的陰影線HS_HORIZONTAL水平陰影線HS_VERTICAL 垂直陰影線353繪圖基礎(chǔ)知識繪圖操作的步驟2:獲得繪圖工具顏色
Windows使用宏RGB定義繪圖的顏色,其形式為:
RGB(nRed,nGreen,nBlue)
紅色值藍(lán)色值綠色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)363繪圖基礎(chǔ)知識基本圖形繪制(熟悉GDI函數(shù))例3在屏幕上畫若干個(gè)點(diǎn),并顯示一個(gè)文本373繪圖基礎(chǔ)知識voidDrawPixels(HWNDhwnd,HDChdc){
//獲得窗口客戶區(qū)坐標(biāo)RECTr;GetClientRect(hwnd,&r);//r—窗口客戶區(qū)//設(shè)置映像模式SetMapMode(hdc,MM_ISOTROPIC);//設(shè)置窗口坐標(biāo)范圍SetWindowExtEx(hdc,100,100,NULL);//設(shè)置視口坐標(biāo)范圍SetViewportExtEx(hdc,r.right,r.bottom,NULL); //客戶區(qū)背景為黑色FillRect(hdc,&r,(HBRUSH)GetStockObject(BLACK_BRUSH));
//輸出一個(gè)文本TextOut(hdc,50,50,TEXT("TEST"),lstrlen(TEXT("TEST")));//畫個(gè)點(diǎn)for(inti=0;i<20;i++) SetPixelV(hdc,20+i,20+i,RGB(255,255,255));}383繪圖基礎(chǔ)知識基本圖形繪制(熟悉GDI函數(shù))例3在屏幕上畫若干個(gè)點(diǎn),并顯示一個(gè)文本在例2的基礎(chǔ)上,編寫DrawPixels函數(shù),并在消息處理時(shí)調(diào)用它。caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); DrawPixels(hwnd,hdc); EndPaint(hwnd,&ps);393繪圖基礎(chǔ)知識基本圖形繪制(熟悉GDI函數(shù))例4在屏幕上畫一個(gè)三角形classPoint{public:Point(doublex1=0.0,doubley1=0.0){x=x1;y=y1;}doubleget_x()const{returnx;}doubleget_y()const{returny;}private:doublex,y;};403繪圖基礎(chǔ)知識基本圖形繪制(熟悉GDI函數(shù))例4在屏幕上畫一個(gè)三角形voidDrawTriangle(HWNDhwnd,HDChdc){ //獲得客戶區(qū)域 RECTr; GetClientRect(hwnd,&r);
//設(shè)置映像模式 SetMapMode(hdc,MM_ISOTROPIC); //設(shè)置窗口坐標(biāo)范圍 SetWindowExtEx(hdc,100,100,NULL); //設(shè)置視口坐標(biāo)范圍 SetViewportExtEx(hdc,r.right,r.bottom,NULL);
//繪制三角形 Pointp[]={Point(10,10),Point(10,19),Point(22,19)};
MoveToEx(hdc,p[0].get_x(),p[0].get_y(),NULL); for(inti=0;i<3;i++) { if(i==2) {LineTo(hdc,p[0].get_x(),p[0].get_y()); continue; }
LineTo(hdc,p[i+1].get_x(),p[i+1].get_y()); }}413繪圖基礎(chǔ)知識基本圖形繪制(熟悉GDI函數(shù))例4在屏幕上畫一個(gè)三角形caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); DrawTriangle(hwnd,hdc); EndPaint(hwnd,&ps);423繪圖基礎(chǔ)知識基本圖形繪制(熟悉GDI函數(shù))例4在屏幕上畫一個(gè)三角形caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); DrawTriangle(hwnd,hdc); EndPaint(hwnd,&ps);433繪圖基礎(chǔ)知識常用繪圖函數(shù)1.設(shè)置畫筆當(dāng)前位置的函數(shù)MoveToEx,
BOOLMoveToEx (HDChdc, intX,Y, //X、Y分別為新位置的邏輯坐標(biāo)
LPPOINTlpPoint //存放原畫筆位置的POINT結(jié)構(gòu)地址 )2.從當(dāng)前位置向指定坐標(biāo)點(diǎn)畫直線的函數(shù)LineToEx, BOOLLineToEx(HDChdc,intX,intY)//X和Y為線段的終點(diǎn)坐標(biāo)443繪圖基礎(chǔ)知識常用繪圖函數(shù)3.從當(dāng)前位置開始,依次用線段連接lpPoints中指定的各點(diǎn)BOOLPolyline(HDChdc,LPPOINTlpPoints, //指向包含各點(diǎn)坐標(biāo)的POINT結(jié)構(gòu)數(shù)組的指針
intnCount //nCount為POINT數(shù)組中點(diǎn)的個(gè)數(shù))453繪圖基礎(chǔ)知識常用繪圖函數(shù)4.繪制橢圓弧線的函數(shù)Arc,BOOLArc( HDChdc, intX1,intY1, //邊框矩形左上角的邏輯坐標(biāo) intX2,intY2, //邊框矩形右下角的邏輯坐標(biāo) intX3,intY3, //橢圓弧起始點(diǎn)坐標(biāo) intX4,intY4 //橢圓弧終止點(diǎn)坐標(biāo))(x1,y1)(x2,y2)(x3,y3)(x4,y4)所畫曲線463繪圖基礎(chǔ)知識常用繪圖函數(shù)5.繪制餅圖,并用當(dāng)前畫刷進(jìn)行填充 BOOLPie( HDChdc, intX1,intY1, //邊框矩形左上角的邏輯坐標(biāo) intX2,intY2, //邊框矩形右下角的邏輯坐標(biāo) intX3,intY3, //橢圓弧起始經(jīng)線的確定點(diǎn)坐標(biāo) intX4,intY4 //橢圓弧終止經(jīng)線的確定點(diǎn)坐標(biāo))(x1,y1)(x2,y2)(x3,y3)(x4,y4)所填區(qū)域473繪圖基礎(chǔ)知識常用繪圖函數(shù)6.繪制矩形,并用當(dāng)前畫刷進(jìn)行填充 BOOLRectangle(HDChdc,intX1,intY1,intX2,intY2)7.繪制圓角矩形,并用當(dāng)前畫刷填充 BOOLRoundRect(HDChdc,intX1,intY1,intX2,intY2,
intnHeight,intnWidth)8.繪制橢圓,并用當(dāng)前畫刷填充
BOOLEllipse(HDChdc,intX1,intY1,intX2,intY2)9.繪制多邊形,并用當(dāng)前畫刷填充
BOOLPolygon(HDChdc,LPPOINTlpPoints,intnCount)48繪圖程序設(shè)計(jì)內(nèi)容提要1項(xiàng)目分析和設(shè)計(jì)2基本的WINDOWS應(yīng)用程序3繪圖基礎(chǔ)知識4繪圖程序Draw的實(shí)現(xiàn)494繪圖程序Draw的實(shí)現(xiàn)基本圖元類基類Shape類是抽象類classShape{public: virtualvoidmove(doubledx,doubledy)=0; virtualvoidSetColor(COLORREFmColor)=0;};504繪圖程序Draw的實(shí)現(xiàn)基本圖元類classPoint:publicShape{public:Point(){x=0.0,y=0.0;}Point(doublex1,doubley1){x=x1;y=y1;}doubleget_x()const{returnx;}doubleget_y()const{returny;}COLORREFget_color()const{returncolor;}virtualvoidmove(doubledx,doubledy){x+=dx;y+=dy;}virtualvoidSetColor(COLORREFmColor){color=mColor;}private:doublex;doubley;COLORREFcolor;};514繪圖程序Draw的實(shí)現(xiàn)基本圖元類classLine:publicShape{public:Line(){}Line(Pointp1,Pointp2){from=p1;to=p2;}Pointget_start()const{returnfrom;}Pointget_end()const{returnto;}COLORREFget_color()const{returncolor;}virtualvoidmove(doubledx,doubledy){from.move(dx,dy);to.move(dx,dy);}virtualvoidSetColor(COLORREFmColor){color=mColor;}private:Pointfrom;Pointto;COLORREFcolor;};524繪圖程序Draw的實(shí)現(xiàn)基本圖元類classCircle:publicShape{public:Circle(){radius=0.0;}Circle(Pointp,doubler){center=p;radius=r;}Pointget_center()const{returncenter;}doubleget_radius()const{returnradius;}COLORREFget_color()const{returncolor;}virtualvoidmove(doubledx,doubledy){center.move(dx,dy);}virtualvoidSetColor(COLORREFmColor) {color=mColor;}private:Pointcenter;doubleradius;COLORREFcolor;};534繪圖程序Draw的實(shí)現(xiàn)基本圖元類#include<string>usingnamespacestd;classMessage{public:Message(){}Message(Points,conststring&m){start=s;text=m;}Pointget_start()const{returnstart;}stringget_text()const{returntext;}voidmove(doubledx,doubledy){start.move(dx,dy);}private:Pointstart;stringtext;};544繪圖程序Draw的實(shí)現(xiàn)繪圖類classGraphicWindow{public:1)構(gòu)造函數(shù)設(shè)置初值2)設(shè)置窗口坐標(biāo)coord();3)清除窗口clear();4)打開窗口open();
4)顯示輸出點(diǎn)、圓、線、文本private:
5)邏輯到設(shè)備坐標(biāo)轉(zhuǎn)換user_to_disp_x(),user_to_disp_y();6)畫點(diǎn)、圓、線、文本7)數(shù)據(jù)成員邏輯坐標(biāo)_user_xmin,_user_xmax,_user_ymin,_user_ymax;
8)數(shù)據(jù)成員設(shè)備坐標(biāo)(像素為單位)_disp_xmax,_disp_ymax;
9)數(shù)據(jù)成員設(shè)備環(huán)境句柄};554繪圖程序Draw的實(shí)現(xiàn)繪圖類classGraphicWindow{public:GraphicWindow():_user_xmin(-10),_user_xmax(10),_user_ymin(10),_user_ymax(-10){}//設(shè)置窗口坐標(biāo)voidcoord(doublexmin,doubleymin,doublexmax,doubleymax){_user_xmin=xmin,_user_xmax=xmax;_user_ymin=ymin,_user_ymax=ymax;
}voidclear();//清除窗口voidGraphicWindow::clear(){//白色背景色COLORREFcolor=RGB(255,255,255);
//創(chuàng)建實(shí)心畫刷(實(shí)際就是用于填充圖形內(nèi)部區(qū)域的位圖)HBRUSHbrush=CreateSolidBrush(color);//選擇畫刷到設(shè)備環(huán)境HBRUSHsaved_brush=(HBRUSH)SelectObject(_hdc,brush);//用選入設(shè)備環(huán)境中的刷子繪制給定的矩形區(qū)域PatBlt(_hdc,0,0,_disp_xmax,_disp_ymax,PATCOPY);//恢復(fù)原來畫刷SelectObject(_hdc,saved_brush);
//刪除實(shí)心畫刷DeleteObject(brush);}564繪圖程序Draw的實(shí)現(xiàn)繪圖類
//打開一個(gè)窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個(gè)點(diǎn)GraphicWindow&operator<<(Pointp);
//顯示一個(gè)圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個(gè)文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設(shè)備x坐標(biāo)轉(zhuǎn)換intuser_to_disp_x(doublex)const;
//邏輯到設(shè)備y坐標(biāo)轉(zhuǎn)換intuser_to_disp_y(doubley)const;
//設(shè)備到邏輯x坐標(biāo)轉(zhuǎn)換doubledisp_to_user_x(intx)const;
//設(shè)備到邏輯y坐標(biāo)轉(zhuǎn)換doubledisp_to_user_y(inty)const;voidGraphicWindow::open(HWNDhwnd,HDChdc){RECTrect;
//獲取窗口客戶區(qū)域大小GetClientRect(hwnd,&rect);_disp_xmax=rect.right-1;_disp_ymax=rect.bottom-1;_hdc=hdc;
//選擇畫刷、畫筆、字體到主窗口設(shè)備環(huán)境SelectObject(_hdc,GetStockObject(BLACK_BRUSH));SelectObject(_hdc,GetStockObject(BLACK_PEN));SelectObject(_hdc,GetStockObject(SYSTEM_FONT));clear();}574繪圖程序Draw的實(shí)現(xiàn)繪圖類
//打開一個(gè)窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個(gè)點(diǎn)GraphicWindow&operator<<(Pointp);
//顯示一個(gè)圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個(gè)文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設(shè)備x坐標(biāo)轉(zhuǎn)換intuser_to_disp_x(doublex)const;
//邏輯到設(shè)備y坐標(biāo)轉(zhuǎn)換intuser_to_disp_y(doubley)const;
//設(shè)備到邏輯x坐標(biāo)轉(zhuǎn)換doubledisp_to_user_x(intx)const;
//設(shè)備到邏輯y坐標(biāo)轉(zhuǎn)換doubledisp_to_user_y(inty)const;GraphicWindow&GraphicWindow::operator<<(Pointp){ point(p.get_x(),p.get_y(),p.get_color()); return*this;}584繪圖程序Draw的實(shí)現(xiàn)繪圖類
//打開一個(gè)窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個(gè)點(diǎn)GraphicWindow&operator<<(Pointp);
//顯示一個(gè)圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個(gè)文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設(shè)備x坐標(biāo)轉(zhuǎn)換intuser_to_disp_x(doublex)const;
//邏輯到設(shè)備y坐標(biāo)轉(zhuǎn)換intuser_to_disp_y(doubley)const;
//設(shè)備到邏輯x坐標(biāo)轉(zhuǎn)換doubledisp_to_user_x(intx)const;
//設(shè)備到邏輯y坐標(biāo)轉(zhuǎn)換doubledisp_to_user_y(inty)const;GraphicWindow&GraphicWindow::operator<<(Circlec){ ellipse(c.get_center().get_x(),c.get_center().get_y(), c.get_radius(),c.get_radius(),c.get_color()); return*this;}594繪圖程序Draw的實(shí)現(xiàn)繪圖類
//打開一個(gè)窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個(gè)點(diǎn)GraphicWindow&operator<<(Pointp);
//顯示一個(gè)圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個(gè)文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設(shè)備x坐標(biāo)轉(zhuǎn)換intuser_to_disp_x(doublex)const;
//邏輯到設(shè)備y坐標(biāo)轉(zhuǎn)換intuser_to_disp_y(doubley)const;
//設(shè)備到邏輯x坐標(biāo)轉(zhuǎn)換doubledisp_to_user_x(intx)const;
//設(shè)備到邏輯y坐標(biāo)轉(zhuǎn)換doubledisp_to_user_y(inty)const;GraphicWindow&GraphicWindow::operator<<(Lines){ line(s.get_start().get_x(),s.get_start().get_y(), s.get_end().get_x(),s.get_end().get_y(),s.get_color()); return*this;}604繪圖程序Draw的實(shí)現(xiàn)繪圖類
//打開一個(gè)窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個(gè)點(diǎn)GraphicWindow&operator<<(Pointp);
//顯示一個(gè)圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個(gè)文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設(shè)備x坐標(biāo)轉(zhuǎn)換intuser_to_disp_x(doublex)const;
//邏輯到設(shè)備y坐標(biāo)轉(zhuǎn)換intuser_to_disp_y(doubley)const;
//設(shè)備到邏輯x坐標(biāo)轉(zhuǎn)換doubledisp_to_user_x(intx)const;
//設(shè)備到邏輯y坐標(biāo)轉(zhuǎn)換doubledisp_to_user_y(inty)const;GraphicWindow&GraphicWindow::operator<<(Messaget){ text(t.get_text(),t.get_start().get_x(),t.get_start().get_y()); return*this;}614繪圖程序Draw的實(shí)現(xiàn)繪圖類
//打開一個(gè)窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個(gè)點(diǎn)GraphicWindow&operator<<(Pointp);
//顯示一個(gè)圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個(gè)文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設(shè)備x坐標(biāo)轉(zhuǎn)換intuser_to_disp_x(doublex)const;
//邏輯到設(shè)備y坐標(biāo)轉(zhuǎn)換intuser_to_disp_y(doubley)const;
//設(shè)備到邏輯x坐標(biāo)轉(zhuǎn)換doubledisp_to_user_x(intx)const;
//設(shè)備到邏輯y坐標(biāo)轉(zhuǎn)換doubledisp_to_user_y(inty)const;intGraphicWindow::user_to_disp_x(doublex)const{return(int)((x-_user_xmin)*_disp_xmax/(_user_xmax-_user_xmin));}intGraphicWindow::user_to_disp_y(doubley)const{return(int)((y-_user_ymin)*_disp_ymax/(_user_ymax-_user_ymin));}624繪圖程序Draw的實(shí)現(xiàn)繪圖類
//打開一個(gè)窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個(gè)點(diǎn)GraphicWindow&operator<<(Pointp);
//顯示一個(gè)圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個(gè)文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設(shè)備x坐標(biāo)轉(zhuǎn)換intuser_to_disp_x(doublex)const;
//邏輯到設(shè)備y坐標(biāo)轉(zhuǎn)換intuser_to_disp_y(doubley)const;
//設(shè)備到邏輯x坐標(biāo)轉(zhuǎn)換doubledisp_to_user_x(intx)const;
//設(shè)備到邏輯y坐標(biāo)轉(zhuǎn)換doubledisp_to_user_y(inty)const;doubleGraphicWindow::disp_to_user_x(intx)const{return(double)x*(_user_xmax-_user_xmin)/_disp_xmax+_user_xmin;}doubleGraphicWindow::disp_to_user_y(inty)const{return(double)y*(_user_ymax-_user_ymin)/_disp_ymax+_user_ymin;}634繪圖程序Draw的實(shí)現(xiàn)繪圖類
//畫一個(gè)點(diǎn)voidpoint(doublex,doubley,COLORREFmColor);
//畫一條線
voidline(doublexfrom,doubleyfrom,doublexto,doubleyto,COLORREFmColor);
//畫一個(gè)橢圓voidellipse(doublex,doubley,doublera,doublerb,COLORREFmColor);
//圖形方式輸出一個(gè)文本串voidtext(stringt,doublex,doubley);
//邏輯坐標(biāo)double_user_xmin,_user_xmax,_user_ymin,_user_ymax;
//設(shè)備坐標(biāo)(像素為單位)int_disp_xmax,_disp_ymax;
//設(shè)備環(huán)境句柄HDC_hdc;};voidGraphicWindow::point(doublex,doubley,COLORREFmColor){constintPOINT_RADIUS=3;intdisp_x=user_to_disp_x(x);intdisp_y=user_to_disp_y(y);SelectObject(_hdc,CreatePen(PS_SOLID,1,mColor));
//畫點(diǎn):小圓圈Ellipse(_hdc,disp_x-POINT_RADIUS,disp_y-POINT_RADIUS, disp_x+POINT_RADIUS,disp_y+POINT_RADIUS);}644繪圖程序Draw的實(shí)現(xiàn)繪圖類
//畫一個(gè)點(diǎn)voidpoint(doublex,doubley,COLORREFmColor);
//畫一條線
voidline(doublexfrom,doubleyfrom,doublexto,doubleyto,COLORREFmColor);
//畫一個(gè)橢圓voidellipse(doublex,doubley,doublera,doublerb,COLORREFmColor);
//圖形方式輸出一個(gè)文本串voidtext(stringt,doublex,doubley);
//邏輯坐標(biāo)double_user_xmin,_user_xmax,_user_ymin,_user_ymax;
//設(shè)備坐標(biāo)(像素為單位)int_disp_xmax,_disp_ymax;
//設(shè)備環(huán)境句柄HDC_hdc;};//畫線:voidGraphicWindow::line(doublexfrom,doubleyfrom, doublexto,doubleyto,COLORREFmColor){ SelectObject(_hdc,CreatePen(PS_SOLID,1,mColor));
//將繪圖位置移動(dòng)到某個(gè)具體點(diǎn) MoveToEx(_hdc,user_to_disp_x(xfrom),user_to_disp_y(yfrom),0);
//圖線 LineTo(_hdc,user_to_disp_x(xto),user_to_disp_y(yto));}654繪圖程序Draw的實(shí)現(xiàn)繪圖類
//畫一個(gè)點(diǎn)voidpoint(doublex,doubley,COLORREFmColor);
//畫一條線
voidline(doublexfrom,doubleyfrom,doublexto,doubleyto,COLORREFmColor);
//畫一個(gè)橢圓voidellipse(doublex,doubley,doublera,doublerb,COLORREFmColor);
//圖形方式輸出一個(gè)文本串voidtext(stringt,doublex,doubley);
//邏輯坐標(biāo)double_user_xmin,_user_xmax,_user_ymin,_user_ymax;
//設(shè)備坐標(biāo)(像素為單位)int_disp_xmax,_disp_ymax;
//設(shè)備環(huán)境句柄HDC_hdc;};voidGraphicWindow::ellipse(doublex,doubley,doublera,doublerb, COLORREFmColor){ SelectObject(_hdc,CreatePen(PS_SOLID,1,mColor));
//畫橢圓(中心為限定矩形的中心,用當(dāng)前的畫刷填充橢圓) Ellipse(_hdc,user_to_disp_x(x-ra),user_to_disp_y(y-rb), user_to_disp_x(x+ra),user_to_disp_y(y+rb));}8.繪制橢圓,并用當(dāng)前畫刷填充
BOOLEllipse(HDChdc,intX1,intY1,intX2,intY2)664繪圖程序Draw的實(shí)現(xiàn)繪圖類
//畫一個(gè)點(diǎn)voidpoint(doublex,doubley,COLORREFmColor);
//畫一條線
voidline(doublexfrom,doubleyfrom,doublexto,doubleyto,COLORREFmColor);
//畫一個(gè)橢圓voidellipse(doublex,doubley,doublera,doublerb,COLORREFmColor);
//圖形方式輸出一個(gè)文本串voidtext(stringt,doublex,doubley);
//邏輯坐標(biāo)double_user_xmin,_user_xmax,_user_ymin,_user_ymax;
//設(shè)備坐標(biāo)(像素為單位)int_disp_xmax,_disp_ymax;
//設(shè)備環(huán)境句柄HDC_hdc;};voidGraphicWindow::text(strings,doublex,doubley){ constchar*t=s.c_str();
//設(shè)置顯示輸出方式:透明輸出(文字背景不改變) SetBkMode(_hdc,TRANSPARENT);
//輸出字符串到指定位置 TextOut(_hdc,user_to_disp_x(x),user_to_disp_y(y),t,lstrlen(t));}674繪圖程序Draw的實(shí)現(xiàn)例7繪制一個(gè)能夠?qū)崟r(shí)走動(dòng)的時(shí)鐘:表盤是黑色的,時(shí)針紅色,分針綠色,秒針黃色,表盤上的時(shí)鐘點(diǎn)為白色。684繪圖程序Draw的實(shí)現(xiàn)#include"ctime"#include"cmath"#include"cstdlib"#include"resource.h"#include"shape.h"#include“graphicWindow.h”#definePI3.1415926GraphicWindowcwin;voidmclock(){ Shape*pShape; cwin<<Message(Point(-2,7),"走動(dòng)的時(shí)鐘");
/*畫表盤*/ intradius=6; Pointorg(0,0); pShape=&org; pShape->SetColor(RGB(255,255,255));//白色,設(shè)置表芯點(diǎn)的顏色 cwin<<org; CircleclkPlate(org,radius); pShape=&clkPlate;
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度保理合同范本3篇
- 2024版同居協(xié)議書范文
- 山西養(yǎng)殖玻璃溫室施工方案
- 五年級數(shù)學(xué)(小數(shù)乘除法)計(jì)算題專項(xiàng)練習(xí)及答案
- 昌邑市初三一模數(shù)學(xué)試卷
- 2025版專業(yè)籃球場地草坪鋪設(shè)與養(yǎng)護(hù)服務(wù)合同3篇
- 無機(jī)硅磨石地面施工方案
- 2024年防火門窗技術(shù)研發(fā)合作協(xié)議3篇
- 2025版綠色建筑項(xiàng)目施工安全協(xié)議書3篇
- 2024年貨品交易中介風(fēng)險(xiǎn)管理協(xié)議
- 醫(yī)療機(jī)構(gòu)資產(chǎn)負(fù)債表(通用模板)
- 廢舊鋰離子電池高值資源化回收利用項(xiàng)目環(huán)評報(bào)告書
- 審計(jì)英語詞匯大全講課教案
- JIS G3507-1-2021 冷鐓用碳素鋼.第1部分:線材
- 初二家長會ppt通用PPT課件
- 小學(xué)生家庭作業(yè)布置存在的誤區(qū)及改進(jìn)策略論文1
- 一元一次含參不等式教學(xué)設(shè)計(jì)83
- 生物醫(yī)學(xué)研究的統(tǒng)計(jì)學(xué)方法課后習(xí)題答案 2014 主編 方積乾
- 牛仔面料成本核算
- 加拿大礦業(yè)政策
- 客情關(guān)系的建立和維護(hù)
評論
0/150
提交評論