- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五实验辅导
• 3.首先在程序菜单中加入一个非弹出式菜单 “实验五”,假设其ID为 ID_SHIYAN5, 建立类向导中对该菜单映射函数,映射到 view类中,做为view类的成员函数,记住 在view.cpp起始部分加入一句: #include "dialoghuitu.h“ 注意:这句话也可以加入到 stdafx.h中去, 同学们注意以后编程可以把所有的头文件 都加入到该文件中,这样可以简化头文件 包含工作,也可以使自己的程序更专业。
实验五实验辅导
• if(deltay>deltax) • { • temp=deltax; • deltax=deltay; • deltay=temp; • interchange=1; • } • else interchange=0; • f=2*deltay-deltax; • pDC->SetPixel(x,y,color);
实验五实验辅导
• 7.在对话框恰当位置加入一些控件,主要是 按钮控件和编辑框控件,一些静态文本框 控件,效果如下图:
实验五实验辅导
• 分别将四个编辑框控件通过类向导设置成 该类的成员变量,分别为 m_x1,m_y1,m_x2,m_y2,都是int类型, • 再把二个按钮 一个绘图,一个清屏都映射 成该类的成员函数,分别添加代码如下:
实验五实验辅导
• • • • • • • • • • • • • • • • • //绘制x轴上的标度和箭头· OnBresenhamline1(rect.left+213,rect.top+36,rect.left+213,rect.bottom-36); OnBresenhamline1(rect.left+213,rect.top+36,rect.left+203,rect.top+46); OnBresenhamline1(rect.left+213,rect.top+36,rect.left+223,rect.top+46); pDC->TextOut(rect.left+215,rect.top+55,"x"); OnBresenhamline1(rect.left+213,yc-50,rect.left+223,yc-50); pDC->TextOut(rect.left+195,yc-56,"50"); OnBresenhamline1(rect.left+213,yc-100,rect.left+223,yc-100); pDC->TextOut(rect.left+190,yc-106,"100"); OnBresenhamline1(rect.left+213,yc-150,rect.left+223,yc-150); pDC->TextOut(rect.left+190,yc-156,"150"); OnBresenhamline1(rect.left+213,yc+50,rect.left+223,yc+50); pDC->TextOut(rect.left+195,yc+44,"-50"); OnBresenhamline1(rect.left+213,yc+100,rect.left+223,yc+100); pDC->TextOut(rect.left+190,yc+94,"-100"); OnBresenhamline1(rect.left+213,yc+150,rect.left+223,yc+150); pDC->TextOut(rect.left+190,yc+144,"-150"); }
实验五实验辅导
5. 在类向导对话框中,选中该对话框类,添加 WM_INITDIALOG 消息函数,该函数类一般放置该类的初 始化变量和设置,该函数先加入如下代码(红色代码)。 • BOOL dialoghuitu::OnInitDialog() • { • CDialog::OnInitDialog(); • // TODO: Add extra initialization here • color=RGB(255,0,0); • return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE • } •
实验五实验辅导
• 4.编程前的准备工作,在绘图类dialoghuitu.h头文 件中加入几个类成员变量作为绘图时候的一些设 备环境和常用接口 • public: • CDC *pDC; • CRect rect; • COLORREF color; • 在头文件中加入bresenham参数方法的函数声明。 • public: • afx_msg void OnBresenhamline1(int x1,int y1,int x2,int y2);
实验五实验辅导
• • • • • • •百度文库• • • • • • • • • • • • for(i=1;i<=(deltax+deltay);i++) { if(f>=0) { if(interchange==1) x+=s1; else y+=s2; pDC->SetPixel(x,y,color); f=f-2*deltax; } else { if(interchange==1) y+=s2; else x+=s1; pDC->SetPixel(x,y,color); f=f+2*deltay; } } return; }
实验五实验辅导
• 6.在类向导中选择dialoghuitu类,然后添加 消息映射函数,WM_PAINT,在函数中添加 如下内容(红色为添加内容):
• void dialoghuitu::OnPaint() • { • CPaintDC dc(this); // device context for paintin • // TODO: Add your message handler code here • pDC=GetDC(); • GetClientRect(&rect); • dc.SelectStockObject(WHITE_BRUSH); • dc.Rectangle(rect.left+213,rect.top+35,rect.right15,rect.bottom-35);
实验五:在对话框中实现绘图
• 2.实现交互式输入绘制直线,要求调用参数形式的 bresenham绘制直线方法。 • 提高性要求: • 实现绘制复杂函数功能,比如样条曲线,Bezier 曲线,正弦余弦函数等。在用户坐标系的x轴正方向 上绘制几个周期,使用小的直线段来逼近曲线,该绘 制交互由步长控制,步长就是一次性跨越几个像素。 • 难点:用户坐标系同窗口坐标系的转换。 • 注:本实验总分15分,实现基本要求的同学得分10 分,有创新的同学根据情况得12分或满分。
实验五实验辅导
• 映射后的view类成员函数中加入下面二句话(红色 所表示部分,即完成了弹出对话框的映射): • void CDddView::Onshiyan5() • { • dialoghuitu dlg1; • dlg1.DoModal(); • } • 下面我们就可以在对话框中编辑资源和代码了, 同学们注意体会面向对象这种编程方法。
实验五实验辅导
• 在该类的cpp文件中加入bresenham方法绘制直线的代码(参数形式)
• void dialoghuitu::OnBresenhamline1(int x1,int y1,int x2,int y2) • { • pDC=GetDC(); • GetClientRect(rect); • int i,s1,s2,interchange; • float x,y,deltax,deltay,f,temp; • x=x1; • y=y1; • deltax=abs(x2-x1); • deltay=abs(y2-y1); • if(x2-x1>=0) s1=1; else s1=-1; • if(y2-y1>=0) s2=1; else s2=-1;
实验五实验辅导
• 实验步骤 • 1.在资源中加入一个对话框资源,假设对话框资源 的标示为 IDD_DIALOG1。如果系统中有加入的对 话框,那么默认的可能标示为 IDD_DIALOG2等等。 调整对话框到合适大小。比默认调整大一点。 • 2.在VC环境中打开查看菜单中的“建立类向导”菜 单,添加一个新对话框类比如dialoghuitu类,那么 在VC中新增加一个dialoghuitu类,即增加 dialoghuitu.h和dialoghuitu.cpp二个文件,创建过程 对应上面创建的IDD_DIALOG1或IDD_DIALOG2资 源。详细操作请见“VC入门”课件。如果操作顺序 有误,比如先执行第二步,再执行第一步,程序运 行会出现一个错误,提示不存在的对话框标示符, 这时候可以找到错误地点,改一下IDD资源即可。
实验五实验辅导
• //相对坐标的原点 • int xc=rect.left+213; • int yc=(rect.bottom-rect.top)/2; • //绘制y轴上的标度和箭头 • OnBresenhamline1(xc,yc,rect.right-16,yc); • OnBresenhamline1(rect.right-16,yc,rect.right-26,yc+10); • OnBresenhamline1(rect.right-16,yc,rect.right-26,yc-10); • pDC->TextOut(rect.right-40,yc+2,"y"); • OnBresenhamline1(xc+50,yc,xc+50,yc-10); • pDC->TextOut(xc+44,yc+2,"50"); • OnBresenhamline1(xc+100,yc,xc+100,yc-10); • pDC->TextOut(xc+90,yc+2,"100"); • OnBresenhamline1(xc+150,yc,xc+150,yc-10); • pDC->TextOut(xc+140,yc+2,"150");
实验五实验辅导
• • • • • • • • • • • • OnBresenhamline1(xc+200,yc,xc+200,yc-10); pDC->TextOut(xc+190,yc+2,"200"); OnBresenhamline1(xc+250,yc,xc+250,yc-10); pDC->TextOut(xc+240,yc+2,"250"); OnBresenhamline1(xc+300,yc,xc+300,yc-10); pDC->TextOut(xc+290,yc+2,"300"); OnBresenhamline1(xc+350,yc,xc+350,yc-10); pDC->TextOut(xc+340,yc+2,"350"); OnBresenhamline1(xc+400,yc,xc+400,yc-10); pDC->TextOut(xc+390,yc+2,"400"); OnBresenhamline1(xc+450,yc,xc+450,yc-10); pDC->TextOut(xc+440,yc+2,"450");
实验五:在对话框中实现交互式绘图
• 学时数:4课时 实验类型:验证型 • 实验目的:实验一中我们在菜单映射中弹出了一 个对话框,并在对话框类中做了个简单的交互式 的加法计算实验,本实验就是在实验一的背景下, 在菜单映射中弹出对话框,实现在对话框中交互 式绘图。要求在对话框中使用几个命令按钮(对应 类的绘图函数)和一些编辑框控件获取用户输入。 • 基本要求: • 1.要求使用画刷,在对话框中刷出一个范围进行 绘图。其中使用用户坐标系绘图,在屏幕中首先 绘制一个坐标系,并要求有刻度标志。