用VisualC++生成基本图形_第1页
用VisualC++生成基本图形_第2页
用VisualC++生成基本图形_第3页
用VisualC++生成基本图形_第4页
用VisualC++生成基本图形_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.5用VisualC++生成基本图形VC++程序需要在屏幕或打印机上绘图时,都要调用GDI(图形设备接口)函数。3.5.1图形设备接口(GDI)GDI的工作原理大致如下:首先,Windows提供各种显示卡及打印机的驱动程序;其次,各种GDI函数会自动参考被称为设备环境的数据结构,而Windows则自动将设备环境结构映射到相应的物理设备,并且提供正确的输入/输出指令。GDI在处理速度上几乎和直接进行视频访问一样快,并且它还允许Windows的不同应用程序共享显示器。GDI包含了可用于绘制点、线、矩形、多边形、椭圆、位图以及文本的功能函数。为了方便使用,在VC++中对其进行了封装,形成了GDI对象类。所有GDI对象类的抽象基类都是CGdiObject,而所有实际使用的GDI对象则是从CGdiObject派生出来的,以下是GDI对象类的列表:nCFont—字体,它是一种具有某种风格和尺寸的所有字符的完整集合,常常被当作资源存于磁盘中,其中有一些还要依赖某种设备。nCPen—画笔,它是用来画线和绘制有形边框的。具体使用时,可以指定其颜色和宽度,也可以指定其线型,例如:实线、虚线或点线。n

CBrush—画刷,通过定义一种位图矩阵,用它可以对区域内部进行填充。nCRgn—区域,它是由多边形、椭圆或者二者组合形成的一种范围,可以利用它来进行填充、裁剪以及鼠标点中测试。n

CBitmap—位图,它是一种位图矩阵,每一个显示像素都对应于其中的一个或多个位。位图可以用来表示图像,也可以用来创建刷子。n

CPalette—调色板,它是一种颜色映射接口,允许一个应用程序在不干扰其他应用程序的前提下,充分利用输出设备的颜色绘制能力。注意:调色板一般只在颜色数为256种或更少的情况下才使用。3.5.2VC++绘图方法用计算机绘图与普通的手工绘图类似,在OnDraw等函数中绘制图形时,必须首先选择好画笔和画刷等绘图工具,确定好绘图坐标及比例尺,然后根据需要选用适当的绘图函数绘出图形。因此,与绘图有关的图形程序库可以分为以下五类:绘图工具选择函数、坐标系统设置与转换函数、绘图模式与背景设置函数、绘图函数区域填充函数。绘图工具选择函数选择库存绘图工具函数原型是:virtualCGdiObject*SelectStockObject(int

nIndex);nIndex是所要选入设备文本对象的库存对象代码,对于画刷和画笔,其值如表3-1所示。例如,可以使用以下代码选择白色画笔和黑色画刷:pDC->SelectStockObject(WHITE_PEN);pDC->SelectStockObject(BLACK_BRUSH);宏代码库存对象宏代码库存对象BLACK_BRUSH黑色画刷NULL_BRUSH空画刷(内部不填充)DKGRAY_BRUSH深灰色画刷WHITE_BRUSH白色画刷GRAY_BRUSH灰色画刷BLACK_PEN黑色画刷HOLLOW_BRUSH透明窗口画刷NULL_PEN空画笔(什么也不画)LTGRAY_BRUSH浅灰色画刷WHITE_PEN白色画笔表3-1画刷和画笔的颜色代码1.可以先构造画笔对象,然后用函数CreatePen初始化。函数原型为:BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);其中,nPenStyle:画笔风格,其值如表3-2。nWidth:画笔的宽度(逻辑单位),crColor:画笔的颜色。2.画笔对象初始化后,就可以调用CDC的成员函数SelectObject将画笔选入设备文本对象。对于画笔,SelectObject的原型为:CPen*SelectObject(CPen*pPen);其中,参数pPen是指向画笔对象的指针。定制画笔画笔风格含义画笔风格含义PS_DASH划线,即为虚线PS_INSIDEFRAME在边界区域内实笔画线PS_DASHDOT点划线PS_NULL空画笔PS_DASHDOTDOT双点划线PS_SOLID实线PS_DOT点线

表3-2画笔风格与含义画刷风格:实心,网格,模式,空四种风格除空画刷,其余画刷先构造,再按下面方法之一初始化:(1)纯色填充图形的内部。函数原型为:BOOLCreateSolidBrush(COLORREFcrColor);//crColor画刷颜色(2)影线模式来填充图形的内部。函数原型为BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);其中,参数nIndex用于指定影线模式,其值如表3-3。定制画刷阴影模式含义阴影模式含义HS_BDIAGONAL反斜线HS_FDIAGONAL斜线HS_CROSS十字线HS_HORIZONAL水平线HS_DIAGCROSS斜十字线HS_VERTICAL竖线表3-3影线模式(3)图案模式来填充图形的内部。函数原型为:BOOLCreatePatternBrush(CBitmap*pBitmap);其中,参数pBitmap是指向位图对象的指针。当用画刷填充图形时,图形内部将用位图一个接一个地填充。初始化完画刷对象之后,就可以调用CDC的成员函数SelectObject将画刷选入设备文本对象。对于画刷,SelectObject的原型为:CBrush*SelectObject(CBrush*pBrush);其中,参数pBrush是指向画刷对象的指针。SelectObject返回一个指向原先已选入设备文本对象的画刷对象的指针。如果在此之前没有选择过画刷对象,则使用缺省画刷。使用VisualC++在Windows下进行图形程序设计的基本步骤是:(1)在绘制之前,创建绘图工具并设置相关的颜色、线型、线宽等属性;(2)调用相关的绘图函数选择绘图工具并进行绘图;(3)在绘制之后,恢复原有的绘图工具。

例(画笔,画刷的使用 ): CBrushbrush; brush.CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0)); CBrush*pOldBrush; CPen*pOldPen; pOldBrush=(CBrush*)pDC->SelectObject(&brush); pOldPen=(CPen*)pDC->SelectStockObject(NULL_PEN); pDC->Ellipse(CRect(50,50,250,250)); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen);

坐标系统设置和转换函数

逻辑坐标是指用户使用CDC绘图函数绘制图形的坐标;设备坐标是指计算机系统使用输出设备(显示器或打印机)来绘出图形的坐标。设备坐标是用户不能改变的。设备坐标的原点总是在左上角。改变逻辑坐标与设备坐标的关系使用CDC的映射模式设置函数。映射模式映射模式用于定义逻辑坐标的单位与设备坐标间的关系。在缺省的映射模式下,逻辑坐标与设备坐标相同,坐标原点也在窗口左上角,以像素为单位,横坐标随光标向右移动而增加,纵坐标随光标向下移动而增加。Windows包含八种不同的映射模式(见表3-4),每种映射模式在应用程序中都有特定的用途。映射模式逻辑单位设备单位轴向MM_HIENGLISH10001英寸

X轴向右,Y轴向上MM_HIMETRIC1001毫米MM_LOENGLISH1001英寸MM_LOMETRIC101毫米MM_TWIPS14401英寸MM_TEXT1设备像素X轴向右,Y轴向下MM_ANISOTROPIC

X和Y的比例可以不一致MM_ISOTROPIC

X和Y的比例一致表3-4Windows包含的八种映射模式设置映射模式:函数原型为virtualintSetMapMode(intnMapMode);参数nMapMode为前面列出的八种映射模式之一。设备坐标转换为逻辑坐标,函数原型为:voidDPtoLP(LPPOINTlpPoints,intnCount=1);voidDPtoLP(LPRECTlpRect);voidDPtoLP(LPSIZElpsize);参数lpPoints是指向POINT结构或CPoint对象的数组,nCount表示数组中的点数。lpRect指向RECT结构或CRect对象,使用这个参数表示将矩形区域的设备点转换为逻辑点。lpsize指向SIZE结构或CSize对象。逻辑坐标转换为设备坐标,函数原型为:voidLPtoDP(LPPOINTlpPoints,intnCount=1);voidLPtoDP(LPRECTlpRect);voidLPtoDP(LPSIZElpsize);绘图模式与背景设置函数设置绘图模式

绘图模式指定Windows如何组合画笔和显示设备上的当前颜色的方式。线的绘制除了由画笔的颜色和宽度决定外,也受当前绘图模式的影响改变绘图模式的函数原型为:intSetROP2(intnDrawMode);参数nDrawMode指定所要求的绘图模式,其值如下表:绘图描述R2_BLACK像素总为黑色R2_WHITE像素总为白色R2_NOP像素保持不变R2_NOT像素为显示颜色的反转色R2_COPYPEN

缺省绘图模式,像素为画笔颜色R2_NOTCOPYPEN像素为画笔颜色的反转色R2_MASKPEN像素为显示颜色与画笔颜色的公共颜色的组合R2_NOTMASKPEN像素为R2_MASKPEN颜色反转色R2_XORPEN像素为画笔颜色与显示颜色的组合,但不同时为这两种颜色R2_NOTXOPEN像素为R2_XORPEN颜色反转色…………CPenpen(PS_SOLID,5,RGB(0,255,255));CPen*pOldPen=pDC->SelectObject(&pen);pDC->SetROP2(R2_XORPEN);pDC->MoveTo(100,100);pDC->LineTo(200,200);//pDC->MoveTo(100,100);//pDC->LineTo(200,200);pDC->SelectObject(pOldPen);背景颜色设置函数原型为:virtualCOLORREFSetBkColor(COLORREFcrColor);

背景模式设置函数原型为:intSetBkMode(intnBkMode);参数nBkMode指定背景模式,其值可以为:OPAQUE:图形背景为SetBkColor设置的当前背景颜色TRANSPARENT:图形背景为当前显示设备上的颜色

pDC->SetBkColor(RGB(255,0,0));pDC->SetBkMode(OPAQUE);pDC->TextOut(300,300,"hello");绘图函数(1)

设置像素(画点)函数原型为:COLORREFSetPixel(intx,inty,COLORREF

crColor);COLORREFSetPixel(POINTpoint,COLORREF

crColor);像素点的位置由参数x和y或者point指定,crColor指定颜色。(2)

画直线MoveTo函数的原型为:CPointMoveTo(intx,inty);//当前位置由参数x和y指定CPointMoveTo(POINTpoint);//当前位置由point指定绘制直线函数原型为:BOOLLineTo(intx,inty);BOOLLineTo(POINTpoint);可以调用Polyline函数画一系列直线。函数原型为:BOOLPolyline(LPPOINTlpPoints,intnCount);lpPoints指定包含线段顶点的POINT结构数组,nCount指定数组中的点数。pDC->MoveTo(5,5);pDC->LineTo(50,50);CPointp[3]={CPoint(20,20),CPoint(150,200),CPoint(100,200)};pDC->Polyline(p,3);(3)

画矩形画矩形有两个CDC成员函数:Rectangle和RoundRect。函数Rectangle画的是方角矩形函数RoundRect画的是圆角矩形函数Rectangle的原型为:BOOLRectangle(intx1,inty1,intx2,inty2)

;BOOLRectangle(LPCRECTlpRect)

;矩形区域由参数(x1,y1)和(x2,y2)或者lpRect指定。左上角坐标为(x1,y1),右下角坐标为(x2,y2)。函数RoundRect的原型为:BOOLRoundRect(intx1,inty1,intx2,inty2,intx3,inty3)

;BOOLRoundRect(LPCRECTlpRect,POINTpoint)

;矩形区域由参数(x1,y1)和(x2,y2)或者lpRect指定。左上角坐标为(x1,y1),右下角坐标为(x2,y2)。矩形区域的圆角由(x3,y3)或者point确定,x3和y3分别指定圆角曲线的宽度和高度。

(4)

画弧画弧函数用边界矩形来定义弧的大小。边界矩形是隐藏的,用于描述弧的位置和大小。函数原型为:BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4)

;BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);边界矩形由参数(x1,y1)和(x2,y2)或者lpRect定义(x1,y1)是边界矩形的左上角坐标,(x2,y2)是边界矩形的右下角坐标。(x3,y3)或者ptStart是弧的起始点。(x4,y4)或者ptEnd是弧的终止点。此外,画弧还可以使用CDC的成员函数ArcTo,函数原型为:BOOLArcTo(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4)

;BOOLArcTo(LPCRECTlpRect,POINTptStart,

POINTptEnd);函数ArcTo与Arc基本相同,不同之处在于ArcTo函数将当前位置更新为弧的终止点。(5)

画椭圆和圆函数原型为:BOOLEllipse(intx1,inty1,intx2,inty2)

;BOOLEllipse(LPCRECTlpRect)

;参数(x1,y1)和(x2,y2)或者lpRect定义的是与椭圆相切的边界矩形,矩形的左上角坐标是(x1,y1),右下角坐标是(x2,y2)。如果要画圆而非椭圆,可以指定正方形为外切边界矩形,此时x2-x1等于y2-y1。画出一个半径为5像素的圆并以黑色填充之,得到一个比较大的点:voidCDrowDotView::OnDraw(CDC*pDC){pDC->SelectStockObject(BLACK_BRUSH);//画出的点为黑色

pDC->Ellipse(CRect(5,10,10,15));

//画一个小圆}一个画圆的例子程序,这个圆的外接矩形左上角坐标是(20,20),右下角坐标是(120,120):voidCDrawEllipseView::OnDraw(CDC*pDC){pDC->Ellipse(20,20,120,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论