计算机图形学实验指导书电子版(4)

2018-12-27 19:01

PS_INSIDEFRAME 创建可以在封闭框架内部绘制直线的画笔。 画笔的宽度用像素个数来确定。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; }

//用不同的宽度的笔绘图

-- 16

for(i1=0;i1<7;i1++) { //构造新笔 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);

-- 17

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

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

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

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

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

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

Brush->Create->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));

函数中有两个参数,第一个参数是画刷的阴影样式,第二个参数是阴影线的颜色。

示例:绘制缺省画刷的矩形,纯色画刷矩形和绘制100单位的矩形,并且用白色45度交叉线阴影将其填充,程序如下: //画刷程序

pDC->Rectangle(300,300,400,400); //缺省的画刷,白色 //纯色画刷

-- 18

CBrush *pNewBrush1; CBrush *pOldBrush1;

pNewBrush1=new CBrush;

if (pNewBrush1->CreateSolidBrush(RGB(255,0,0))) { //选择新画刷

pOldBrush1=pDC->SelectObject(pNewBrush1); //绘制矩形

pDC->Rectangle(200,200,300,400); //恢复原有画刷

pDC->SelectObject(pOldBrush1); }

delete pNewBrush1; //阴影画刷

CBrush Brush(HS_DIAGCROSS,RGB(255,255,255)); CBrush *pOldBrush;

pOldBrush=pDC->SelectObject(&Brush); pDC->SetBkColor(RGB(192,192,192)); pDC->Rectangle(0,0,100,100); pDC->SelectObject(pOldBrush);

3.2.4 文本显示

Windows可以显示很多数据,包括在窗口中显示文本信息。由于文本是以图像的形式显 示在窗口中的,因此需要处理设备描述表(DC),另外还需要对文本字体的处理,包括:文本的显示、文本的颜色、字符的间距和文本的对齐方式等。

(1)文本显示

在拥有一个设备描述表以后,就可以调用TextOut()函数来显示文本行。例如: pDC->TextOut(20,20,”This is a line of text.”);

TextOut()函数的三个参数分别是输出文本的X坐标和Y坐标以及输出文本串。 (2)设置文本颜色 在默认情况下,Windows绘制黑色文本。可以通过SetTextColor()函数改变文本的颜色。例如:

CDC *pDC=GetDC(); //声明一个设备描述表pDC1 pDC->SetTextColor(RGB(255,0,0)); //设置文本颜色为红色 可以通过GetTextColor()函数检索到当前文本的颜色,例如: COLORREF color=pDC->GetTextColor();

SetBkColor()和GetBkColor()函数用于设置背景颜色和获取当前的背景颜色。

(2)设置字符间距

SetTextCharacterExtra()函数用来设置文本字符的间距,GetTextCharacterExtra()用来获得当前文本字符的间距,函数说明如下:

pDC-> SetTextCharacterExtra(space);

-- 19

int space=pDC-> GetTextCharacterExtra();

其中,space表示在文本字符之间使用的额外空间的像素数。

(3)设置文本的对齐方式

SetTextAlign()函数用于设置显示文本的对齐方式,函数说明如下:

pDC->SetTextAlign(alignment);

其中,alignment参数取值:TA_LEFT、TA_CENTER和TA_RIGHT,分别表示左对齐、居中方法和右对齐。Alignment参数取值:TA_TOP、TA_BOTTOM和TA_BASELINE分别表示文本在垂直方向的对齐方式,上对齐、下对齐和字符的基线对齐。

3.3 鼠标编程

在图形操作系统中,鼠标是最重要的输入设备之一。Windows系统为用户提供了统一的鼠标编程接口,而不必过多了解其底层的知识。Windows是基于消息传递、事件驱动的操作系统,当用户移动鼠标、按下或释放鼠标键时都会产生鼠标消息。应用程序可以接收10种鼠标消息,表3.3列出了这些鼠标消息和它们的描述。 表3.3鼠标消息和描述

消 息 描 述

WM_LBUTTONDBLCLK 鼠标左键被双击

WM_LBUTTONDOWN 鼠标左键被按下

WM_LBUTTONUP 鼠标左键被释放

WM_MBUTTONDBLCLK 鼠标中键被双击

WM_MBUTTONDOWN 鼠标中键被按下

WM_MBUTTONUP 鼠标中键被释放

WM_MOUSEMOVE 鼠标移动穿过对象区域

WM_RBUTTONDBLCLK 鼠标右键被双击

WM_RBUTTONDOWN 鼠标右键被按下

WM_RBUTTONUP 鼠标右键被释放

3.3.1 鼠标消息处理

MFC把鼠标消息处理函数封装在CView类中,它们分别是:

OnMouseMove(UINT nFlags, CPoint point); OnLButtonDblclk(UINT nFlags, CPoint point); OnLButtonDown(UINT nFlags, CPoint point); OnLButtonUp(UINT nFlags, CPoint point); ……

分别对应表3.3中10个鼠标消息。在鼠标处理函数中,point参数代表鼠标热点处的坐标位置,point.x为横坐标,point.y为纵坐标。默认坐标原点(0,0)位于窗口的左上角。由于应用程序要求自动捕获鼠标事件,因此应当采用Windows事件处理函数,而不是成员函数,具体使用方法参见3.3.3节示例程序。

nFlags参数中包含了鼠标按钮和键盘组合使用标志,用来描述鼠标按钮和键盘上的Shift

-- 20


计算机图形学实验指导书电子版(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:【精品】2018年高考语文非连续性文本阅读

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: