1、利用Resource View设计菜单,如图6-1所示;图6-1 菜单设计示例菜单 选项 绘图(&P) Pop-up=Checked 菜单项 ID值提示(Prompt) 直线 m_line 两点直线圆 m_circle 画圆,圆心和半径椭圆 m_ellipse 绘制椭圆矩形 m_rectangle 绘制矩形 添加方法:选择ViewClassWizard菜单项,弹出如图3-19所示的创建类对话框,从中选择工程名(Projects)和类名(Class name),并从Object IDs列表框中选择m_line项,在Messages列表框中选择COMMAND,然后,单击“Add Function”
2、按钮,弹出加入成员函数的对话框,输入成员函数名OnMLine,确定后就添加了OnMLine消息映射函数。参照以上方法,添加上表中其他的函数。步骤4:绘制直线按照第4章实验一任务三的步骤,实现交互式绘直线;按照第4章实验二,实现交互式画圆;但需要做如下的修改:(1)加入成员变量m_item,用于表示绘图选择项, proctected :int m_item ; / 0:不绘图,1:直线,2:圆,3:椭圆,4:矩形;(2)在构造函数中初始化变量;CJhsView:CJhsView() / TODO: add construction code here /画直线的初始化参数 m_p1.x=0; m
3、_p1.y=0; /起点 m_p2.x=0; m_p2.y=0; /终点 m_ist=0; /0,第1点;1,第2点;m_item=0; /0:/ m_bO.x=0; m_bO.y=0; /圆心 m_bR.x=0; m_bR.y=0; /圆上的点 / m_ist=0; /圆心与圆上的点区别 m_r=0; /圆的半径 (3)添加菜单驱动函数:方法是右击CjhsView类,选择消息映射函数(add window message handler)。在弹出的对话框中的class or object to handle列表中选择m_ine,按下“add and edit”,并在弹出的对话框中输入菜单驱动
4、函数的名字(OnMLine),按下“确定”键。同理,建立画圆的菜单驱动程序OnMCircle。void CJhsView:OnMLine() Add your command handler code here m_item=1;OnMCircle() m_item=2;(4)在OnDraw()中不进行绘图,主要靠鼠标绘图。OnDraw(CDC* pDC) CJhsDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); add draw code for native data here /画直线 / Redraw(pDC);/ 调用自定义的成员函数,用鼠标
5、画直线(5)鼠标左击和移动程序OnLButtonDown(UINT nFlags, CPoint point) Add your message handler code here and/or call default CDC *pDC=GetDC();pDC-SelectStockObject(NULL_BRUSH);/ char tbuf10;/ sprintf(tbuf,m_item=%3d,m_item);/ AfxMessageBox(tbuf);if (m_item=1) / 绘直线 if (!m_ist) /是起点 m_p1=m_p2=point; /纪录第一次单击鼠标位置,定
6、圆心 m_ist+;else m_p2=point; /记录第二次单击鼠标的位置,定终点的点 m_ist-; / 为新绘图作准备 DDAMouseLine(pDC,m_p1.x,m_p1.y,m_p2.x,m_p2.y,RGB(255,0,0); /绘制新直线 else if (m_item=2) /绘圆 /CDC *pDC=GetDC();/pDC-m_ist) /绘制圆 m_bO=m_bR=point;m_bR=point; /记录第二次单击鼠标的位置,定圆周上的点 m_r=ComputeRadius(m_bO,m_bR);MidpointCircle(pDC,m_bO.x,m_bO.y,
7、m_r,RGB(255,0,0);ReleaseDC(pDC); /释放设备环境 CView:OnLButtonDown(nFlags, point);OnMouseMove(UINT nFlags, CPoint point) int nDrawmode=pDC-SetROP2(R2_NOT); /设置异或绘图模式,并保存原来绘图模式 if(m_ist=1) CPoint prePnt,curPnt;prePnt=m_p2; /获得鼠标所在的前一位置 curPnt=point;/绘制橡皮筋线 DDAMouseLine(pDC,m_p1.x,m_p1.y,prePnt.x,prePnt.y,R
8、GB(255,0,0);/DrawCircle(pDC,m_bO,prePnt); /用异或模式重复画圆,擦出所画的圆 DDAMouseLine(pDC,m_p1.x,m_p1.y,curPnt.x,curPnt.y,RGB(255,0,0);/DrawCircle(pDC,m_bO,curPnt); /用当前位置作为圆周上的点画圆 SetROP2(nDrawmode); /恢复原绘图模式 else if (m_item=2) /绘圆 prePnt=m_bR;m_r=ComputeRadius(m_bO,prePnt);/用异或模式重复画圆,擦出所画的圆 / DrawCircle(pDC,m_
9、bO,prePnt);m_r=ComputeRadius(m_bO,curPnt);OnMouseMove(nFlags, point);步骤五:调试、编译、运行程序。3.3 实验体会在实验进行过程中,虽然经过反复检测,但还是出现了诸多问题,其中有些问题暂未解决。虽然建立菜单过程中较顺利,但如何将文件中的变量通用还是没有调试好。虽然实验过程中还存在着较多的未解决的问题和遗憾,但我依然受益匪浅。通过对实验内容的理解和把握,我掌握图形输入和交互技术的基本方法,也掌握部分图形交互技术的实现方法。同时,进一步熟练编程语言环境中图形绘制技术。最重要的是加深了我对图形学的兴趣和认识。希望在今后的学习中,我可以加强专业技能,早日攻破这些障碍。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1