2020-03-02 23:49:50 来源:范文大全收藏下载本文
实验三 MFC画直线
最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮
助
第一步:构建MFC窗体
打开Visual C++ 6.0编译器 新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。这样一个简单的MFC窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。
第二步:编辑菜单项
选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。双击空白会弹出“菜单项目 属性”对话框。ID:ID_DRAW_LINE;标明:
DrawLine(&D),其它的为缺省。
第三步:建立消息命令
如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。 通过“查看—Meage Maps—Project:DrawLine—Cla name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function„”,其它为默认,最后确定完成。现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。
第四步:添加鼠标消息响应
打开ClaView视窗,右键选定CDrawLineView,选择Add Windows Meage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。
第五步:添加响应代码
首先,在ClaView视窗中双击CDrawLineView会定位到“DrawLineView.h : interface of the CDrawLineView cla”的文件,添加CDrawLineView类的成员:protected: int m_Drag; POINT m_pPrev; POINT m_pOrigin;三个成员变量。视窗中展开CDrawLineView类,双击定位OnLBUTTONDOWN()函数。在该函数消息响应
处添加如下代码:
//建立好绘图的设备环境
CClientDC dc(this); OnPrepareDC(&dc);
dc.DPtoLP(&point);
//获取起始点坐标 m_pPrev=point; m_pOrigin=point;
m_Drag=1;
然后,定位于OnMouseMove(),添加如下代码(其中关键用到了橡皮筋技术):
//建立好绘图的设备环境
CClientDC dc(this);
OnPrepareDC(&dc); dc.DPtoLP(&point);
dc.SetROP2(R2_NOT);//橡皮筋绘图技术
//判断是否BUTTONDOWN
if(m_Drag)
{
dc.MoveTo(m_pOrigin); dc.LineTo(m_pPrev); dc.MoveTo(m_pOrigin); dc.LineTo(point);
}
m_pPrev=point;
最后,在OnLBUTTONDOWN()添加代码: m_Drag=0;
程序运行效果图
2
实验4 实现圆的生成算法
一、实验目的
1.熟悉CDC图形程序库; 2.掌握中点画圆生成算法; 3.掌握Bresenham画圆算法。
二、实验内容
利用VisualC++6.0设计一个简易画圆绘图板,验证圆生成算法。
三、实验指导
1.生成绘图应用程序的框架,如下图所示。 具体实现见第二次实验,过程不再详细说明。
2.在应用程序中增加菜单
完成相关菜单的设计,具体的效果如下图所示,并设置好相关菜单消息的映射,具体的实现在前面的实验中介绍过,再此不在详细说明。
3.在绘图函数中添加代码
通过以上步骤,得到了与菜单对应的消息映射,就可以在函数中添加代码绘制图形了。 (1)利用中点画圆算法实现圆的生成(算法原理见教材)。 void CDraw_CirView::OnMid() { // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针
RedrawWindow();//重绘窗口
int x,y,x0=200,y0=200,r=100;//圆的圆心为(x0,y0),半径为r float d; x=0; y=r; d=1.25-r;
pDC->SetPixel(x+x0,y+y0,RGB(255,0,0)); pDC->SetPixel(y+x0,x+y0,RGB(255,0,0)); pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0)); pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0)); pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0)); pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0)); pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0)); pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0)); while(x
if(d
{
d=d+2*x+3;
x++;
}
else
{
d=d+2*(x-y)+5;
x++;
y--;}
pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0)); } } 由以上代码绘出的图形如下:
(2)利用Bresenham算法生成圆(算法原理见教材)。 void CDraw_CirView::OnBre() {
5 // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针
//RedrawWindow();//重绘窗口
int x,y,x0=200,y0=200,r=50;//圆的圆心为(x0,y0),半径为r int delta,delta1,delta2,direction; x=0;y=r; delta=2*(1-r); while(y>=0) {
pDC->SetPixel(x+x0,y+y0,RGB(0,0,255));
pDC->SetPixel(x+x0,-y+y0,RGB(0,0,255));
pDC->SetPixel(-x+x0,y+y0,RGB(0,0,255));
pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,255));
if(delta
{
delta1=2*(delta+y)-1;
if(delta
else direction=2;
}
else if(delta>0)
{
delta2=2*(delta-x)-1;
if(delta2
else direction=3;
}
else direction=2;
switch(direction)
{
case 1:x++;
delta+=2*x+1;
break;
case 2:x++;y--;
delta+=2*(x-y+1);
break;
case 3:y--;
delta+=(-2*y+1);
break;
} } }
由以上代码绘出的图形如下:
(3)以上是本次实验的基本部分,利用中点画圆和Bresenham画圆算法实现的基本图形的绘制。能不能利用该算法,完成一些复杂图形的生成,比如利用基本的画圆算法绘制一个奥运五环。甚至根据画圆算法,实现二次曲线的生成,如椭圆的生成等等。请同学们认真考虑,完成这部分的内容,上机调试。
四、思考
1.如何实现圆心为任意位置的圆的绘制; 2.两种画圆算法的比较。
人人范文网 m.inrrp.com.cn 手机版