




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1程序設計實踐
Windows編程基礎知識2繪圖程序設計內容提要1項目分析和設計2基本的WINDOWS應用程序3繪圖基礎知識4繪圖程序Draw的實現31項目分析和設計需求分析功能需求
能繪制由基本圖元(點、線、圓、橢圓、文字)組成的各種圖形或動畫,可以響應鼠標事件(菜單項)。界面要求
應用程序提供用戶區供繪圖使用,用戶區可以顯示坐標軸、原點等。41項目分析和設計界面設計
在界面上可設置菜單,布置菜單項,按用戶需求完成特定繪圖功能,在繪圖客戶區可以顯示坐標軸、原點等。51項目分析和設計總體設計軟件架構
61項目分析和設計總體設計類關系圖
7繪圖程序設計內容提要1項目分析和設計2基本的WINDOWS應用程序3繪圖基礎知識4繪圖程序Draw的實現82基本的WINDOWS應用程序基本的WINDOWS應用程序例1:編寫一個簡單的windows程序,只有基本框架代碼,沒有具體功能。92基本的WINDOWS應用程序例1:第一步:建立一個新的工程(1)啟動VisualStudio,選擇菜單項“文件”點擊“新建---項目”,在彈出窗口中項目類型選擇“win32”,繼續選擇“win32項目”,為項目起名“Draw”。
102基本的WINDOWS應用程序例1:第一步:建立一個新的工程(2)點擊“確定”后,在彈出窗口中進行“應用程序設置”,選擇“windows應用程序”,選中“空項目”,然后點擊“完成”。
112基本的WINDOWS應用程序例1:第二步:設置字符集(1)在生成的解決方案名稱上,單擊鼠標右鍵,在彈出的菜單條上,選擇“屬性”122基本的WINDOWS應用程序例1:第二步:設置字符集(2)在彈出的窗口中,選擇“配置屬性”=>“常規”點擊“字符集”右側下拉框選中“未設置”然后“確定”。132基本的WINDOWS應用程序例1:第三步:為工程添加源文件/頭文件。包含頭文件:#include<cstdlib>#include"windows.h"usingnamespacestd;添加WinMain函數和窗口過程函數142基本的WINDOWS應用程序例2,在例1基礎上添加菜單第一~三步同例1第四步:為工程添加資源文件。Windows資源可以是標準的,也可以是自定義的。標準資源中的數據描述了圖標、光標、菜單、對話框、位圖和加速鍵表等。應用程序自定義的資源,則包含任何特定應用程序需要的數據。152基本的WINDOWS應用程序例2:第四步:為工程添加菜單//fig.rc#include"resource.h"http://MenuIDC_TEST2MENUBEGINPOPUP"&File“ //定義彈出式菜單BEGIN MENUITEM"時鐘", IDM_FIG1 MENUITEM"Fig2", IDM_FIG2 MENUITEM"E&xit", IDM_EXITENDEND菜單項標識,在消息wParam中包含選中菜單項的標識。每個菜單項的標識必須唯一,標識值常在頭文件中定義162基本的WINDOWS應用程序例2:第四步:為工程添加頭文件資源文件。//Resource.h#defineIDM_FIG1 104#defineIDM_FIG2 105#defineIDM_EXIT 106#defineIDC_TEST2 109172基本的WINDOWS應用程序例2,第五步:修改窗口類的定義lpszMenuName添加頭文件:#include"resource.h"wndclass.lpszMenuName=MAKEINTRESOURCE(IDC_TEST2);182基本的WINDOWS應用程序例2,第六步:消息循環部分需要增加菜單命令消息處理192基本的WINDOWS應用程序 caseWM_COMMAND: //處理菜單消息 wmId=LOWORD(wParam); //菜單項標識 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應用程序InvalidateRect函數原型
BOOLInvalidateRect( HWNDhWnd,//要更新的客戶區所在的窗體的句柄 CONSTRECT*lpRect,//無效矩形區域 BOOLbErase//重畫標志 );作用:該函數向指定的窗體更新區域添加一個矩形,然后窗口客戶區域的這一部分將被重新繪制,發送WM_PAINT消息。InvalidateRect(hwnd,NULL,TRUE);
NULL表示全部窗口區域21繪圖程序設計內容提要1項目分析和設計2基本的WINDOWS應用程序3繪圖基礎知識4繪圖程序Draw的實現223繪圖基礎知識圖形處理技術Windows圖形設備接口(GDI)
與設備無關的圖形設計的。即操作系統屏蔽了硬件設備的差異,使用戶編程時無需考慮特殊的硬件設置OpenGL技術
與硬件無關的三維圖形軟件接口,是一個提供3D圖形繪制及著色功能的API函數庫。DirectX技術
基于COM的一套軟件編程接口,它為基于windows平臺的應用程序提供了圖像、音頻等組件233繪圖基礎知識圖形設備接口GDI設備描述表句柄(DeviceContext,DC)用于應用程序和物理設備之間進行交互,它是GDI的關鍵元素。設備描述表是一種數據結構,它包括了一個設備(如顯示器和打印機)繪制屬性的相關信息。所有的繪制操作通過設備描述表進行。應用程序不能直接訪問設備描述表,只能由各種相關的API函數通過設備描述表句柄來間接訪問該結構。
243繪圖基礎知識圖形設備接口GDI顯示器設備描述表,總是與某個窗口或這窗口上的某個顯示區域相關。
Windows窗口一旦創建,它就自動地產生了與之相對應的設備描述表數據結構,用戶可運用該結構,實現對窗口顯示區域的GDI操作,如劃線、寫文本、繪制位圖、填充等,并且所有這些操作均要通過設備描述表句柄來進行。253繪圖基礎知識圖形刷新是繪圖過程中必須考慮的重要問題刷新請求窗口大小的調整、窗口移動、被覆蓋后的恢復……系統對刷新請求的響應當用戶區的內容需要刷新時,系統向應用程序消息隊列發送WM_PAINT消息,系統在應用程序的消息隊列中加入該消息,以通知窗口函數執行刷新處理有效的刷新方法重新繪制。將圖形繪制處理程序放在消息WM_PAINT響應模塊中,刷新時重繪圖形263繪圖基礎知識映射模式定義了將邏輯單位轉化為設備的度量單位以及設備的x方向和y方向程序員可在一個統一的邏輯坐標系中操作而不必考慮輸出設備的坐標系缺省的映像模式:MM_TEXT(1)將一個邏輯單位映射為:1個像素(2)坐標系設定:X右,Y下(正方向)273繪圖基礎知識映射模式映像模式將一個邏輯單位映像為坐標系設定MM_ANISOTROPIC系統確定可選MM_HIENGLISH英寸Y向上,X向右MM_HIMETRIC毫米Y向上,X向右MM_ISOTROPIC系統確定可選,但x軸和y軸的單位比例為1:1MM_LOENGLISH英寸Y向上,X向右MM_LOMETRIC毫米Y向上,X向右MM_TEXT一個像素Y向下,X向右MM_TWIPS英寸Y向上,X向右283繪圖基礎知識圖形設備接口GDI畫筆和畫刷是最重要的繪圖工具,而選用繪圖工具進行繪圖操作的一般步驟是:(1)獲得設備環境句柄;(2)獲得繪圖工具;創建畫筆、畫刷將畫筆、畫刷選入設備環境不使用時,刪除畫筆、畫刷293繪圖基礎知識繪圖操作的步驟1:獲得設備環境句柄;方法1:調用函數BeginPaint——WM_PAINT消息(1)應用程序響應WM_PAINT消息圖形刷新時,調用BeginPaint函數獲取設備環境
hdc=BeginPaint(hwnd,&ps);// PAINTSTRUCTps;(2)必須用EndPaint函數釋放。方法2:調用函數GetDC(1)獲取設備環境:hdc=GetDC(hwnd);(2)釋放設備環境:ReleaseDC(hwnd);系統獲取設備環境的同時填寫ps結構,標識無效矩形區303繪圖基礎知識繪圖操作的步驟1:獲得設備環境句柄;313繪圖基礎知識繪圖操作的步驟2:獲得繪圖工具畫筆(1)創建畫筆HPENhP;//定義畫筆句柄。hP=GetStockObject(BLACK_PEN);//獲取畫筆(2)將畫筆選入設備環境SelectObject(hdc,hP);//hP為所創建或獲取的畫筆句柄(3)刪除畫筆DeleteObject(hP);//不使用畫筆時,需刪除,以免占內存Windows系統定義的四種畫筆WHITE_PEN,BLACK_PEN,DC_PEN,NULL_PEN323繪圖基礎知識繪圖操作的步驟2:獲得繪圖工具(1)創建新畫筆hP=CreatePen(intnPenStyle, //確定畫筆樣式intnWidth, //畫筆寬度COLORREFrgbColor//畫筆顏色);PS_DASH: 虛線 PS_DASHDOT: 點劃線 PS_DASHDOTDOT: 雙點劃線PS_DOT: 點線 PS_INSIDEFRAME: 實線PS_NULL: 無 PS_SOLID: 實線333繪圖基礎知識繪圖操作的步驟2:獲得繪圖工具畫刷(1)創建畫刷HBRUSHhBr;//定義畫刷句柄。hBr=(HBRUSH)GetStockObject(nBrushStyle)//畫刷樣式(2)將畫刷選入設備環境SelectObject(hdc,hBr);//hBr為所創建或獲取的畫刷句柄(3)刪除畫刷DeleteObject(hBr);//不使用畫刷時,需刪除,以免占內存系統定義的七種畫刷BLACK_BRUSH 黑色畫刷DKGRAY_BRUSH 深灰色畫刷GRAY_BRUSH 灰色畫刷HOLLOW_BRUSH 虛畫刷LTGRAY_BRUSH 亮灰色畫刷NULL_BRUSH 空畫刷WHITE_BRUSH 白色畫刷343繪圖基礎知識繪圖操作的步驟2:獲得繪圖工具畫刷(1)創建新畫刷
調用CreateSolidBrush函數和CreateHatchBrush函數 hBr=CreateSolidBrush(rgbColor);//rgbColor畫刷顏色
hBr=CreateHatchBrush( intnHctchStyle, COLORREFrgbColor );創建具有指定顏色的單色畫刷創建指定陰影圖案和顏色的畫刷陰影模式:HS_BDIAGONAL45度從左上到右下HS_DIAGCROSS45度叉線 HS_FDIAGONAL45度從左下到右上HS_CROSS 垂直相交的陰影線HS_HORIZONTAL水平陰影線HS_VERTICAL 垂直陰影線353繪圖基礎知識繪圖操作的步驟2:獲得繪圖工具顏色
Windows使用宏RGB定義繪圖的顏色,其形式為:
RGB(nRed,nGreen,nBlue)
紅色值藍色值綠色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)363繪圖基礎知識基本圖形繪制(熟悉GDI函數)例3在屏幕上畫若干個點,并顯示一個文本373繪圖基礎知識voidDrawPixels(HWNDhwnd,HDChdc){
//獲得窗口客戶區坐標RECTr;GetClientRect(hwnd,&r);//r—窗口客戶區//設置映像模式SetMapMode(hdc,MM_ISOTROPIC);//設置窗口坐標范圍SetWindowExtEx(hdc,100,100,NULL);//設置視口坐標范圍SetViewportExtEx(hdc,r.right,r.bottom,NULL); //客戶區背景為黑色FillRect(hdc,&r,(HBRUSH)GetStockObject(BLACK_BRUSH));
//輸出一個文本TextOut(hdc,50,50,TEXT("TEST"),lstrlen(TEXT("TEST")));//畫個點for(inti=0;i<20;i++) SetPixelV(hdc,20+i,20+i,RGB(255,255,255));}383繪圖基礎知識基本圖形繪制(熟悉GDI函數)例3在屏幕上畫若干個點,并顯示一個文本在例2的基礎上,編寫DrawPixels函數,并在消息處理時調用它。caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); DrawPixels(hwnd,hdc); EndPaint(hwnd,&ps);393繪圖基礎知識基本圖形繪制(熟悉GDI函數)例4在屏幕上畫一個三角形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繪圖基礎知識基本圖形繪制(熟悉GDI函數)例4在屏幕上畫一個三角形voidDrawTriangle(HWNDhwnd,HDChdc){ //獲得客戶區域 RECTr; GetClientRect(hwnd,&r);
//設置映像模式 SetMapMode(hdc,MM_ISOTROPIC); //設置窗口坐標范圍 SetWindowExtEx(hdc,100,100,NULL); //設置視口坐標范圍 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繪圖基礎知識基本圖形繪制(熟悉GDI函數)例4在屏幕上畫一個三角形caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); DrawTriangle(hwnd,hdc); EndPaint(hwnd,&ps);423繪圖基礎知識基本圖形繪制(熟悉GDI函數)例4在屏幕上畫一個三角形caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); DrawTriangle(hwnd,hdc); EndPaint(hwnd,&ps);433繪圖基礎知識常用繪圖函數1.設置畫筆當前位置的函數MoveToEx,
BOOLMoveToEx (HDChdc, intX,Y, //X、Y分別為新位置的邏輯坐標
LPPOINTlpPoint //存放原畫筆位置的POINT結構地址 )2.從當前位置向指定坐標點畫直線的函數LineToEx, BOOLLineToEx(HDChdc,intX,intY)//X和Y為線段的終點坐標443繪圖基礎知識常用繪圖函數3.從當前位置開始,依次用線段連接lpPoints中指定的各點BOOLPolyline(HDChdc,LPPOINTlpPoints, //指向包含各點坐標的POINT結構數組的指針
intnCount //nCount為POINT數組中點的個數)453繪圖基礎知識常用繪圖函數4.繪制橢圓弧線的函數Arc,BOOLArc( HDChdc, intX1,intY1, //邊框矩形左上角的邏輯坐標 intX2,intY2, //邊框矩形右下角的邏輯坐標 intX3,intY3, //橢圓弧起始點坐標 intX4,intY4 //橢圓弧終止點坐標)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所畫曲線463繪圖基礎知識常用繪圖函數5.繪制餅圖,并用當前畫刷進行填充 BOOLPie( HDChdc, intX1,intY1, //邊框矩形左上角的邏輯坐標 intX2,intY2, //邊框矩形右下角的邏輯坐標 intX3,intY3, //橢圓弧起始經線的確定點坐標 intX4,intY4 //橢圓弧終止經線的確定點坐標)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所填區域473繪圖基礎知識常用繪圖函數6.繪制矩形,并用當前畫刷進行填充 BOOLRectangle(HDChdc,intX1,intY1,intX2,intY2)7.繪制圓角矩形,并用當前畫刷填充 BOOLRoundRect(HDChdc,intX1,intY1,intX2,intY2,
intnHeight,intnWidth)8.繪制橢圓,并用當前畫刷填充
BOOLEllipse(HDChdc,intX1,intY1,intX2,intY2)9.繪制多邊形,并用當前畫刷填充
BOOLPolygon(HDChdc,LPPOINTlpPoints,intnCount)48繪圖程序設計內容提要1項目分析和設計2基本的WINDOWS應用程序3繪圖基礎知識4繪圖程序Draw的實現494繪圖程序Draw的實現基本圖元類基類Shape類是抽象類classShape{public: virtualvoidmove(doubledx,doubledy)=0; virtualvoidSetColor(COLORREFmColor)=0;};504繪圖程序Draw的實現基本圖元類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的實現基本圖元類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的實現基本圖元類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的實現基本圖元類#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的實現繪圖類classGraphicWindow{public:1)構造函數設置初值2)設置窗口坐標coord();3)清除窗口clear();4)打開窗口open();
4)顯示輸出點、圓、線、文本private:
5)邏輯到設備坐標轉換user_to_disp_x(),user_to_disp_y();6)畫點、圓、線、文本7)數據成員邏輯坐標_user_xmin,_user_xmax,_user_ymin,_user_ymax;
8)數據成員設備坐標(像素為單位)_disp_xmax,_disp_ymax;
9)數據成員設備環境句柄};554繪圖程序Draw的實現繪圖類classGraphicWindow{public:GraphicWindow():_user_xmin(-10),_user_xmax(10),_user_ymin(10),_user_ymax(-10){}//設置窗口坐標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);
//創建實心畫刷(實際就是用于填充圖形內部區域的位圖)HBRUSHbrush=CreateSolidBrush(color);//選擇畫刷到設備環境HBRUSHsaved_brush=(HBRUSH)SelectObject(_hdc,brush);//用選入設備環境中的刷子繪制給定的矩形區域PatBlt(_hdc,0,0,_disp_xmax,_disp_ymax,PATCOPY);//恢復原來畫刷SelectObject(_hdc,saved_brush);
//刪除實心畫刷DeleteObject(brush);}564繪圖程序Draw的實現繪圖類
//打開一個窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個點GraphicWindow&operator<<(Pointp);
//顯示一個圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設備x坐標轉換intuser_to_disp_x(doublex)const;
//邏輯到設備y坐標轉換intuser_to_disp_y(doubley)const;
//設備到邏輯x坐標轉換doubledisp_to_user_x(intx)const;
//設備到邏輯y坐標轉換doubledisp_to_user_y(inty)const;voidGraphicWindow::open(HWNDhwnd,HDChdc){RECTrect;
//獲取窗口客戶區域大小GetClientRect(hwnd,&rect);_disp_xmax=rect.right-1;_disp_ymax=rect.bottom-1;_hdc=hdc;
//選擇畫刷、畫筆、字體到主窗口設備環境SelectObject(_hdc,GetStockObject(BLACK_BRUSH));SelectObject(_hdc,GetStockObject(BLACK_PEN));SelectObject(_hdc,GetStockObject(SYSTEM_FONT));clear();}574繪圖程序Draw的實現繪圖類
//打開一個窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個點GraphicWindow&operator<<(Pointp);
//顯示一個圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設備x坐標轉換intuser_to_disp_x(doublex)const;
//邏輯到設備y坐標轉換intuser_to_disp_y(doubley)const;
//設備到邏輯x坐標轉換doubledisp_to_user_x(intx)const;
//設備到邏輯y坐標轉換doubledisp_to_user_y(inty)const;GraphicWindow&GraphicWindow::operator<<(Pointp){ point(p.get_x(),p.get_y(),p.get_color()); return*this;}584繪圖程序Draw的實現繪圖類
//打開一個窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個點GraphicWindow&operator<<(Pointp);
//顯示一個圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設備x坐標轉換intuser_to_disp_x(doublex)const;
//邏輯到設備y坐標轉換intuser_to_disp_y(doubley)const;
//設備到邏輯x坐標轉換doubledisp_to_user_x(intx)const;
//設備到邏輯y坐標轉換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的實現繪圖類
//打開一個窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個點GraphicWindow&operator<<(Pointp);
//顯示一個圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設備x坐標轉換intuser_to_disp_x(doublex)const;
//邏輯到設備y坐標轉換intuser_to_disp_y(doubley)const;
//設備到邏輯x坐標轉換doubledisp_to_user_x(intx)const;
//設備到邏輯y坐標轉換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的實現繪圖類
//打開一個窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個點GraphicWindow&operator<<(Pointp);
//顯示一個圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設備x坐標轉換intuser_to_disp_x(doublex)const;
//邏輯到設備y坐標轉換intuser_to_disp_y(doubley)const;
//設備到邏輯x坐標轉換doubledisp_to_user_x(intx)const;
//設備到邏輯y坐標轉換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的實現繪圖類
//打開一個窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個點GraphicWindow&operator<<(Pointp);
//顯示一個圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設備x坐標轉換intuser_to_disp_x(doublex)const;
//邏輯到設備y坐標轉換intuser_to_disp_y(doubley)const;
//設備到邏輯x坐標轉換doubledisp_to_user_x(intx)const;
//設備到邏輯y坐標轉換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的實現繪圖類
//打開一個窗口voidopen(HWNDhwnd,HDCmainwin_hdc);//顯示一個點GraphicWindow&operator<<(Pointp);
//顯示一個圓GraphicWindow&operator<<(Circlec);
//顯示一條線GraphicWindow&operator<<(Lines);
//顯示一個文本串GraphicWindow&operator<<(Messaget);private:
//邏輯到設備x坐標轉換intuser_to_disp_x(doublex)const;
//邏輯到設備y坐標轉換intuser_to_disp_y(doubley)const;
//設備到邏輯x坐標轉換doubledisp_to_user_x(intx)const;
//設備到邏輯y坐標轉換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的實現繪圖類
//畫一個點voidpoint(doublex,doubley,COLORREFmColor);
//畫一條線
voidline(doublexfrom,doubleyfrom,doublexto,doubleyto,COLORREFmColor);
//畫一個橢圓voidellipse(doublex,doubley,doublera,doublerb,COLORREFmColor);
//圖形方式輸出一個文本串voidtext(stringt,doublex,doubley);
//邏輯坐標double_user_xmin,_user_xmax,_user_ymin,_user_ymax;
//設備坐標(像素為單位)int_disp_xmax,_disp_ymax;
//設備環境句柄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));
//畫點:小圓圈Ellipse(_hdc,disp_x-POINT_RADIUS,disp_y-POINT_RADIUS, disp_x+POINT_RADIUS,disp_y+POINT_RADIUS);}644繪圖程序Draw的實現繪圖類
//畫一個點voidpoint(doublex,doubley,COLORREFmColor);
//畫一條線
voidline(doublexfrom,doubleyfrom,doublexto,doubleyto,COLORREFmColor);
//畫一個橢圓voidellipse(doublex,doubley,doublera,doublerb,COLORREFmColor);
//圖形方式輸出一個文本串voidtext(stringt,doublex,doubley);
//邏輯坐標double_user_xmin,_user_xmax,_user_ymin,_user_ymax;
//設備坐標(像素為單位)int_disp_xmax,_disp_ymax;
//設備環境句柄HDC_hdc;};//畫線:voidGraphicWindow::line(doublexfrom,doubleyfrom, doublexto,doubleyto,COLORREFmColor){ SelectObject(_hdc,CreatePen(PS_SOLID,1,mColor));
//將繪圖位置移動到某個具體點 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的實現繪圖類
//畫一個點voidpoint(doublex,doubley,COLORREFmColor);
//畫一條線
voidline(doublexfrom,doubleyfrom,doublexto,doubleyto,COLORREFmColor);
//畫一個橢圓voidellipse(doublex,doubley,doublera,doublerb,COLORREFmColor);
//圖形方式輸出一個文本串voidtext(stringt,doublex,doubley);
//邏輯坐標double_user_xmin,_user_xmax,_user_ymin,_user_ymax;
//設備坐標(像素為單位)int_disp_xmax,_disp_ymax;
//設備環境句柄HDC_hdc;};voidGraphicWindow::ellipse(doublex,doubley,doublera,doublerb, COLORREFmColor){ SelectObject(_hdc,CreatePen(PS_SOLID,1,mColor));
//畫橢圓(中心為限定矩形的中心,用當前的畫刷填充橢圓) 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.繪制橢圓,并用當前畫刷填充
BOOLEllipse(HDChdc,intX1,intY1,intX2,intY2)664繪圖程序Draw的實現繪圖類
//畫一個點voidpoint(doublex,doubley,COLORREFmColor);
//畫一條線
voidline(doublexfrom,doubleyfrom,doublexto,doubleyto,COLORREFmColor);
//畫一個橢圓voidellipse(doublex,doubley,doublera,doublerb,COLORREFmColor);
//圖形方式輸出一個文本串voidtext(stringt,doublex,doubley);
//邏輯坐標double_user_xmin,_user_xmax,_user_ymin,_user_ymax;
//設備坐標(像素為單位)int_disp_xmax,_disp_ymax;
//設備環境句柄HDC_hdc;};voidGraphicWindow::text(strings,doublex,doubley){ constchar*t=s.c_str();
//設置顯示輸出方式:透明輸出(文字背景不改變) SetBkMode(_hdc,TRANSPARENT);
//輸出字符串到指定位置 TextOut(_hdc,user_to_disp_x(x),user_to_disp_y(y),t,lstrlen(t));}674繪圖程序Draw的實現例7繪制一個能夠實時走動的時鐘:表盤是黑色的,時針紅色,分針綠色,秒針黃色,表盤上的時鐘點為白色。684繪圖程序Draw的實現#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),"走動的時鐘");
/*畫表盤*/ intradius=6; Pointorg(0,0); pShape=&org; pShape->SetColor(RGB(255,255,255));//白色,設置表芯點的顏色 cwin<<org; CircleclkPlate(org,radius); pShape=&clkPlate;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 毽球生產工廠企業制定與實施新質生產力項目商業計劃書
- 智能化人造革銷售預測系統企業制定與實施新質生產力項目商業計劃書
- 未知地域發現行業跨境出海項目商業計劃書
- 汽車與交通培訓企業制定與實施新質生產力項目商業計劃書
- 物聯網智能物流倉儲系統行業深度調研及發展項目商業計劃書
- 水上游樂園AI應用行業深度調研及發展項目商業計劃書
- 汽車維修與保養培訓企業制定與實施新質生產力項目商業計劃書
- 大數據驅動的市場分析服務行業深度調研及發展項目商業計劃書
- AI輔助醫藥行業深度調研及發展項目商業計劃書
- 氣球冒險樂園企業制定與實施新質生產力項目商業計劃書
- 水利安全生產風險防控“六項機制”右江模式經驗分享
- 《在競爭中雙贏》教學設計 心理健康八年級全一冊
- MOOC 知識創新與學術規范-南京大學 中國大學慕課答案
- 中外美術評析與欣賞智慧樹知到期末考試答案章節答案2024年湖南大學
- 《電力設備典型消防規程》(DL 5027-2015)宣貫
- MOOC 企業文化與商業倫理-東北大學 中國大學慕課答案
- (2024年)小學體育籃球規則課件
- 如何提高自身的網絡安全意識
- 中醫學理論體系的形成和發展
- 中醫養生五臟
- 山東省高考志愿規劃
評論
0/150
提交評論