当前位置:首页 > 计算机图形学学习总结
Bezier曲线,其中曲线通过第一点和最后一点,并且第一条边和最后一条边是曲线在起点和终点处的切线,从而确定了曲线的走向。PolyBezier()函数可以画出一条或多条Bezier曲线,其函数原型说明如下:
BOOL CDC:: PolyBezier(CONST POINT * lppt, DWORD cPoints);
其中,lppt参数是曲线控制顶点所组成的数组,cPoints参数表示lppt数组中的顶点数,一条Bezier曲线需要四个控制顶点。如果lppt数组用于画多条Bezier曲线,第二条以后的曲线只需要三个控制顶点,因为后面的曲线总是把前一条曲线的终点作为自己的起点。 示例,给出四个控制顶点,画出一条Bezier曲线和特征多边形。 //绘制Bezier 曲线
POINT polyBezier[4]={{20,310},{60,240},{120,300},{160,330}}; pDC->Polyline(polyBezier,4); pDC->PolyBezier(polyBezier,4);
(4)画封闭曲线
Windows中提供了一组画封闭曲线的函数,包括绘制矩形、多边性、椭圆等,这些画封闭曲线的函数不但可以利用画笔来画出轮廓线,同时还可以利用画刷来填充这些封闭曲线所围成的区域。 Rectangle()函数用来画矩形,其函数原型说明如下: int nRightRect, int nBottomRect);
BOOL CDC:: Rectangle(int nLeftRect, int nTopRect,
其中,参数nLeftRect和 nTopRect给出了矩形左上角的坐标,而nRightRect和nBottomRect则给出矩形的右下角坐标。
Ellipse()函数的作用则是画椭圆形。在Ellipse()函数中,椭圆是由其外接矩形来确定的,外接矩形的中心与椭圆中心重合,矩形的长与宽和椭圆的长短轴相等。函数说明如下: int nRightRect, int nBottomRect);
BOOL CDC:: Ellipse(int nLeftRect, int nTopRect, 其中的参数说明与Rectangle()函数相同。
RoundRect()函数用来画圆角矩形,其函数的原型说明如下: int nWidth, int nHeight);
int nRightRect, int nBottomRect,
BOOL CDC:: RoundRect(int nLeftRect, int nTopRect,
其中的前四个参数与Rectangle()函数相同,nWidth表示圆角的宽度, nHeight表示圆角的高度。 Polygon()函数用来画封闭的任意多边形,其函数原型说明如下: BOOL CDC:: Polygon((COUST POINT *lpPoints, int cCount);
其中的参数说明与Polyline()函数相同。但两个函数有区别,Polygon()函数会自动将起点和终点相连形成封闭的多边形,而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);
(5) 画笔与画刷
(1)画笔
当绘制图形时,线条的属性,包括颜色、宽度、样式等都是由画笔来确定的。程序员可以创建画笔,定义画笔的属性,从而画出多彩的图形。
创建画笔包括CreatePen()和CreatePenIndirect()两个函数。MFC将这些函数封装在CPen类中,这样画笔就能够被视为对象进行处理。下面介绍创建画笔的方法。
方法一:直接构造一个CPen对象,并将定义画笔的参数传给它,例如:
5
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
创建虚线笔,只有当画笔宽度小于或等于1时有效 PS_DOT
创建点线笔,只有当画笔宽度小于或等于1时有效 PS_DASHDOT
点划线笔,只有当画笔宽度小于或等于1时有效 PS_DASHDOTDOT
双点划线笔,只有当画笔宽度小于或等于1时有效 PS_NULL
创建NULL笔,不绘制任何图形 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;
6
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++) {
//构造新笔
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);
7
pDC->LineTo(520,60+i1*20); //恢复原有的笔
pDC->SelectObject(pOldPen); } 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); //缺省的画刷,白色 //纯色画刷
CBrush *pNewBrush1; CBrush *pOldBrush1;
8
共分享92篇相关文档