admin 管理员组

文章数量: 1086019


2024年6月2日发(作者:matlab 32位下载)

1 实验目的

1)掌握MFC应用程序框架的创建方法;

2)掌握MFC二位坐标系映射模式设置方法;

3)掌握MFC基本绘图函数的应用;

4)掌握MFC双缓冲绘图机制的应用;

5)掌握太极八卦鱼图案的设计方法。

2 实验要求

1)建立空的MFC应用程序,图形绘制代码以单独绘制函数实现,然后添加到

CTestView::OnDraw()函数进行绘制显示;

2)设置绘制坐标原点为View视图区域中心,X轴正向水平向右,Y轴正向垂直向上;

3)太极八卦鱼图案通过MFC的椭圆、扇形绘制函数组合进行绘制实现,图案绘制在

视图区域中心位置;

4)使用双缓冲机制进行图形绘制,所有图形先绘制到用户自定的DC,绘制完成后再

统一拷贝到屏幕Dc。

3 详细设计

3.1 核心算法及类型设计

Void CTestView::DrawTaiJiFish(CDC*pDC)

{

CPen NewPen,*pOldPen;

CBrush NewBrush,*pOldBrush;

long R=200;

CPoint dl,tr,sp,ep;

dl=CPoint(-R,-R); tr=CPoint(R,R);

SolidBrush (RGB(0,0,0));

pOldBrush=pDC->SelectObject (&NewBrush);

sp=CPoint(0,-R);

ep=CPoint(0,R);

pDC->Pie (CRect(dl,tr),sp,ep);

pDC ->SelectObject (pOldBrush );

NewBrush .DeleteObject ();

long r=R/2;

NewPen .CreatePen (PS_SOLID ,1,RGB(255,255,255));

pOldPen =pDC ->SelectObject (&NewPen );

dl=CPoint(-r,0);

tr=CPoint(r,R);

pDC->Ellipse (CRect(dl,tr));

pDC->SelectObject (pOldPen );

NewPen .DeleteObject ();

NewBrush .CreateSolidBrush (RGB(0,0,0));

pOldBrush =pDC->SelectObject (&NewBrush );

dl=CPoint (-r,-R);

tr=CPoint (r,0);

pDC->Ellipse (CRect(dl,tr));

pDC->SelectObject (pOldBrush );

Object ();

long r1=R/8;

NewBrush .CreateSolidBrush (RGB (0,0,0));

pOldBrush =pDC->SelectObject (&NewBrush );

dl=CPoint (-r1,r-r1);

tr=CPoint (r1,r+r1);

pDC->Ellipse (CRect(dl,tr));

pDC->SelectObject (pOldBrush );

NewBrush .DeleteObject ();

Pen (PS_SOLID ,1,RGB(255,255,255));

pOldPen =pDC->SelectObject (&NewPen );

dl=CPoint(-r1,-r-r1);

tr=CPoint(r1,r1-r);

pDC->Ellipse (CRect(dl,tr));

pDC->SelectObject (pOldPen );

NewPen .DeleteObject ();

pOldBrush =(CBrush*)pDC->SelectStockObject (NULL_BRUSH);

dl=CPoint (R,R);

tr=CPoint(-R,-R);

pDC->Ellipse (CRect(dl,tr));

pDC->SelectObject (pOldBrush );

}

Void CTestView ::OnDraw (CDC*pDC)

{

CTestDoc *pDoc=GetDocument ();

ASSERT_VALID (pDoc);

if(!pDoc)

return ;

CRect rect;

GetClientRect(&rect);

pDC->SetMapMode(MM_ANISOTROPIC );

pDC->SetWindowExt ( (),());

pDC->SetViewportExt ( (),- ());

pDC->SetViewportOrg ( ()/2, ()/2);

CDC MemDC;

CBitmap NewBitmap,*pOldBitmap;

CompatibleDC(pDC);

CompatibleBitmap (pDC, (), ());

pOldBitmap =Object (&NewBitmap );

lidRect (rect,pDC->GetBkColor ());

Mode (MM_ANISOTROPIC );

dowExt( (), ());

wportExt ( (),- ());

wportOrg ( ()/2, ()/2);

DrawTaiJiFish (&MemDC);

pDC->BitBlt (- ()/2,- ()/2, (),

(),&MemDC,- ()/2,- ()/2,SRCCOPY );

Object (pOldBitmap );

NewBitmap .DeleteObject ();

}

3.2 程序设计实现及流程图

按照黑心半圆、鱼头黑白圆、鱼眼黑白小圆、大空心圆的层次顺序依次绘制。其中五

个不同大小的圆可通过MFC的椭圆函数实现绘制,设定合适的外接矩形左下角(x1,y1)

和右上角(x2,y2)的坐标参数。五个圆的参数分别为:

大空心圆:(-R,-R),(R,R);

鱼头处黑圆:(-R/2,-R),(R/2,0),白圆:(-R/2,0),(R/2,0);

鱼眼处小黑圆:(-R/8,3R/8),(R/8,5R/8),小白圆:(-R/8,-5R/8),(R/8,-3R/8);

黑心半圆可通过MFC的扇形函数绘制,函数原型如下:

BOOL Pie(int 1x,int y1,int x2,int y2,int x3,int y3,int x4,int y4);

其中外接矩阵左下角和右下角的坐标参数为(-R,,-R),(R,R);起点(x3,y3)的

坐标为(0,-R);终点(x4,y4)坐标为(0,R)。

4 典型测试结果

5 实验问题总结

绘制太极八卦鱼图案是第一次的实验作业,所以完成作业时就完全是抄的书上的代码。

然而即使这样,我的图形也不是一次就成功做出来了的。由于在一个很微小的地方敲错了

代码,结果改了很久才发现问题所在。这让我明白完成作业需要极大的耐心及十分的细心。

同时,通过完成这次作业,也让我对绘制图形的过程已经有了初步的了解,在以后的学习

中,也一定会有更深入的了解。


本文标签: 绘制 函数 图案 实现 进行