教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 基础教育 >

计算机图形学实验指导书(6)

来源:网络收集 时间:2026-08-08
导读: 点和终点相连形成封闭的多边形,而Polyline()函数则画出多条折线,只有当最后一点与起点相同时才画出封闭的多边形。 示例,绘制矩形、圆角矩形、椭圆和多边形,程序如下: //绘制矩形、圆角矩形、椭圆和多边形 pDC-

点和终点相连形成封闭的多边形,而Polyline()函数则画出多条折线,只有当最后一点与起点相同时才画出封闭的多边形。

示例,绘制矩形、圆角矩形、椭圆和多边形,程序如下: //绘制矩形、圆角矩形、椭圆和多边形 pDC->Rectangle(190,270,250,310);

pDC->RoundRect(265,270,330,310,30,20); pDC->Ellipse(260-50,200-30,260+50,200+30);

POINT polygonPts[3]={{390,160},{430,220},{350,210}}; pDC->Polygon(polygonPts,3);

3.2.3 画笔与画刷

(1)画笔

当绘制图形时,线条的属性,包括颜色、宽度、样式等都是由画笔来确定的。程序员可以创建画笔,定义画笔的属性,从而画出多彩的图形。

创建画笔包括CreatePen()和CreatePenIndirect()两个函数。MFC将这些函数封装在CPen类中,这样画笔就能够被视为对象进行处理。下面介绍创建画笔的方法。

方法一:直接构造一个CPen对象,并将定义画笔的参数传给它,例如: CPen pen(PS_SOLID,1,RGB(255,0,0));

创建一个宽度为一个像素、实线和红色的画笔。

方法二:首先声明一个没有初始化的CPen类对象,然后再用CreatePen()函数定义画笔的属性。例如,

CPen Pen;

Pen.CreatePen (PS_SOLID,1,RGB(255,0,0));

方法三:先声明一个CPen类对象和一个描述画笔结构的LOGPEN类对象,并填入画笔的属性值,然后调用CreatePenIndirect()函数来创建画笔。如下所示:

CPen Pen;

LOGPEN LogPen;

LogPen.lopnStyle=PS_SOLID; LogPen.lopnWidth=1;

LogPen.lpenColor=RGB(255,0,0); Pen.CreatePenIndirect(&LogPen);

如果画笔被成功创建,那么两个函数返回TRUE,否则返回FALSE。 画笔包括样式、宽度和颜色三个属性。表3.2列出了GDI画笔的样式。 表3.2 GDI画笔的样式

样式 PS_SOLID PS_DASH PS_DOT PS_DASHDOT PS_DASHDOTDOT PS_NULL PS_INSIDEFRAME 创建实线笔 创建虚线笔,只有当画笔宽度小于或等于1时有效 创建点线笔,只有当画笔宽度小于或等于1时有效 点划线笔,只有当画笔宽度小于或等于1时有效 双点划线笔,只有当画笔宽度小于或等于1时有效 创建NULL笔,不绘制任何图形 创建可以在封闭框架内部绘制直线的画笔。 说 明 -- 12

画笔的宽度用像素个数来确定。PS_DASH、PS_DOT、PS_DASHDOT和PS_DASHDOTDOT参数要求画笔宽度只能为1,其它参数可以创建任意宽度的画笔。画笔的颜色是一个24位的RGB颜色,由RGB(rColor,gColor,bColor)来定义,三个参数取值0~255。

Windows预定义了三个实线、1个像素宽的画笔,它们是WHITE_PEN、BLACK_PEN和NULL_PEN,程序中可以直接使用这些画笔,方法如下:

CPen Pen;

Pen.CreateStockObject(WHITE_PEN);

示例:在屏幕上绘制三组直线,第一组按不同线型绘制,第二组按不同宽度绘制,第三组按不同颜色绘制。程序如下: //画笔的样式、宽度和颜色 int i1;

int nPenStyle[]= { PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,

PS_INSIDEFRAME, };

CPen *pNewPen; CPen *pOldPen; //用不同样式的画笔 for (i1=0;i1<7;i1++) { //构造新笔 pNewPen=new CPen; if (pNewPen->CreatePen(nPenStyle[i1],1,RGB(0,0,0))) { pOldPen=pDC->SelectObject(pNewPen); //选择新笔,并保存旧笔 //画直线 pDC->MoveTo(20,60+i1*20); pDC->LineTo(160,60+i1*20); //恢复原有的笔 pDC->SelectObject(pOldPen); } else { //出错提示 AfxMessageBox(\ } //删除新笔 delete pNewPen; }

//用不同的宽度的笔绘图 for(i1=0;i1<7;i1++)

-- 13

{ //构造新笔 pNewPen=new CPen; if (pNewPen->CreatePen(PS_SOLID,i1+1,RGB(0,0,0))) { pOldPen=pDC->SelectObject(pNewPen); //画直线 pDC->MoveTo(200,60+i1*20); pDC->LineTo(340,60+i1*20); //恢复原有的笔 pDC->SelectObject(pOldPen); } else { //出错提示 AfxMessageBox(\ } //删除新笔 delete pNewPen; }

//设置颜色表 struct tagColor { int r,g,b; } color[7]= { {255,0,0},{0,255,0},{0,0,255}, {255,255,0},{255,0,255},{0,255,255},{0,0,0}, };

//用不同颜色绘图 for(i1=0;i1<7;i1++) { //构造新笔 pNewPen=new CPen; if (pNewPen->CreatePen(PS_SOLID,2,RGB(color[i1].r,color[i1].g,color[i1].b))) { pOldPen=pDC->SelectObject(pNewPen); //画直线 pDC->MoveTo(380,60+i1*20); pDC->LineTo(520,60+i1*20); //恢复原有的笔 pDC->SelectObject(pOldPen); }

-- 14

else { //出错提示 AfxMessageBox(\ } //删除新笔 delete pNewPen; }

//画笔程序结束 (2)画刷

在进行区域填充或绘制封闭图形时,需要用到画刷。MFC把GDI画刷封装在CBrush类中。画刷分三种基本类型:纯色画刷、阴影画刷和图案画刷。

纯色画刷绘图使用单色来定义,颜色由RGB()函数来确定。纯色画刷可以采用直接声明的方法,例如:

CBrush Brush(RGB(255,0,0)); 创建一个红色画刷。

也可以采用分步方法,由CreateSolidBrush()函数创建。 CBrush Brush;

Brush.CreateSolidBrush(RGB(255,0,0));

Windows预定义了七种画刷,包括:BLACK_BRUSH、 DKGRAY_BRUSH、 GRAY_BRUSH、LTGRAY_BRUSH、HOLLOW_BRUSH、NULL_BRUSH和WHITE_BRUSH。可以参照CPen类的方法,采用CreateStockObject()来使用预定义的画刷。

阴影画刷使用预定义的六种阴影样式进行绘图。表3.3列出了六种阴影样式。 表3.3六种阴影样式

阴影样式 说明 HS_BDIAGONAL 45度向下阴影线(从左到右) HS_CROSS 水平线与垂直线交叉阴影

HS_DIAGCROSS 45度方向的交叉阴影线

HS_FDIAGONAL 45度向上阴影线(从左到右)

HS_HORIZONTAL 水平阴影线

HS_VERTICAL 垂直阴影线

创建阴影画刷的方法与纯色画刷的创建方法相似,例如创建一个45度方向的交叉阴影线的画刷,方法如下:

CBrush Brush(HS_DIAGCROSS,RGB(255,0,0)); 或者

CBrush Brush;

Brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));

函数中有两个参数,第一个参数是画刷的阴影样式,第二个参数是阴影线的颜色。 …… 此处隐藏:1550字,全部文档内容请下载后查看。喜欢就下载吧 ……

计算机图形学实验指导书(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/564065.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)