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 实验问题总结
绘制太极八卦鱼图案是第一次的实验作业,所以完成作业时就完全是抄的书上的代码。
然而即使这样,我的图形也不是一次就成功做出来了的。由于在一个很微小的地方敲错了
代码,结果改了很久才发现问题所在。这让我明白完成作业需要极大的耐心及十分的细心。
同时,通过完成这次作业,也让我对绘制图形的过程已经有了初步的了解,在以后的学习
中,也一定会有更深入的了解。
版权声明:本文标题:太极八卦鱼图案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1717266010a703897.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论