版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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"//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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度技术服务合同标的:技术服务包括服务内容、服务期限、服务质量等
- 二零二四年度大学实验室设备租赁合同
- 2024年度服务合同(详细版)
- 销售砂石合同范本
- 2024年度影视版权购买与分销合同
- 2024年度营销推广合作协议
- 2024年度市场调研数据保密协议
- 建筑门窗合同范本
- 客厅吊灯灯具买卖合同范本
- 2024年度固废处理与资源化规划合同
- 人教版2023-2024学年数学六年级上册 第四单元《比》单元真题拔高卷(参考答案)人教版
- 智能制造的智能化和数字化
- 离心机安全应急预案
- 作业设计《质量守恒定律》
- GB/T 43320-2023焊缝无损检测超声检测薄壁钢构件自动相控阵技术的应用
- 网络安全漏洞培训与教育
- 机械气道廓清技术临床应用专家共识2023(完整版)
- 财产混同专项审计报告范文
- 银河麒麟高级服务器操作系统运维管理习题答案
- 110报警服务台接处警登记表
- 干细胞治疗流程
评论
0/150
提交评论