实验三_图形交互技术(完结版)Word格式.doc
《实验三_图形交互技术(完结版)Word格式.doc》由会员分享,可在线阅读,更多相关《实验三_图形交互技术(完结版)Word格式.doc(6页珍藏版)》请在冰豆网上搜索。
![实验三_图形交互技术(完结版)Word格式.doc](https://file1.bdocx.com/fileroot1/2022-10/4/fb121251-2ce0-442e-934a-149827d8630d/fb121251-2ce0-442e-934a-149827d8630d1.gif)
利用ResourceView设计菜单,如图6-1所示;
图6-1菜单设计示例菜单
选项
绘图(&
P)
Pop-up=Checked
菜单项
ID值
提示(Prompt)
直线
m_line
两点直线
圆
m_circle
画圆,圆心和半径
椭圆
m_ellipse
绘制椭圆
矩形
m_rectangle
绘制矩形
添加方法:
选择View\ClassWizard菜单项,弹出如图3-19所示的创建类对话框,从中选择工程名(Projects)和类名(Classname),并从ObjectIDs列表框中选择m_line项,在Messages列表框中选择COMMAND,然后,单击“AddFunction”按钮,弹出加入成员函数的对话框,输入成员函数名OnMLine,确定后就添加了OnMLine消息映射函数。
参照以上方法,添加上表中其他的函数。
步骤4:
绘制直线
按照第4章实验一任务三的步骤,实现交互式绘直线;
按照第4章实验二,实现交互式画圆;
但需要做如下的修改:
(1)加入成员变量m_item,用于表示绘图选择项,
proctected:
intm_item;
//0:
不绘图,1:
直线,2:
圆,3:
椭圆,4:
矩形;
(2)在构造函数中初始化变量;
CJhsView:
:
CJhsView()
{
//TODO:
addconstructioncodehere
//画直线的初始化参数
m_p1.x=0;
m_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类,选择消息映射函数(addwindowmessagehandler…)。
在弹出的对话框中的classorobjecttohandle列表中选择m_ine,按下“addandedit”,并在弹出的对话框中输入菜单驱动函数的名字(OnMLine),按下“确定”键。
同理,建立画圆的菜单驱动程序OnMCircle。
voidCJhsView:
OnMLine()
Addyourcommandhandlercodehere
m_item=1;
OnMCircle()
m_item=2;
(4)在OnDraw()中不进行绘图,主要靠鼠标绘图。
OnDraw(CDC*pDC)
CJhsDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
adddrawcodefornativedatahere
//画直线
//Redraw(pDC);
//调用自定义的成员函数,用鼠标画直线
(5)鼠标左击和移动程序
OnLButtonDown(UINTnFlags,CPointpoint)
Addyourmessagehandlercodehereand/orcalldefault
CDC*pDC=GetDC();
pDC->
SelectStockObject(NULL_BRUSH);
//chartbuf[10];
//sprintf(tbuf,"
m_item=%3d"
m_item);
//AfxMessageBox(tbuf);
if(m_item==1)//绘直线
if(!
m_ist)//是起点
m_p1=m_p2=point;
//纪录第一次单击鼠标位置,定圆心
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));
//绘制新直线
elseif(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,m_r,RGB(255,0,0));
ReleaseDC(pDC);
//释放设备环境
CView:
OnLButtonDown(nFlags,point);
OnMouseMove(UINTnFlags,CPointpoint)
intnDrawmode=pDC->
SetROP2(R2_NOT);
//设置异或绘图模式,并保存原来绘图模式
if(m_ist==1)
CPointprePnt,curPnt;
prePnt=m_p2;
//获得鼠标所在的前一位置
curPnt=point;
//绘制橡皮筋线
DDAMouseLine(pDC,m_p1.x,m_p1.y,prePnt.x,prePnt.y,RGB(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);
//恢复原绘图模式
}elseif(m_item==2)//绘圆
prePnt=m_bR;
m_r=ComputeRadius(m_bO,prePnt);
//用异或模式重复画圆,擦出所画的圆
//DrawCircle(pDC,m_bO,prePnt);
m_r=ComputeRadius(m_bO,curPnt);
OnMouseMove(nFlags,point);
步骤五:
调试、编译、运行程序。
3.3实验体会
在实验进行过程中,虽然经过反复检测,但还是出现了诸多问题,其中有些问题暂未解决。
虽然建立菜单过程中较顺利,但如何将文件中的变量通用还是没有调试好。
虽然实验过程中还存在着较多的未解决的问题和遗憾,但我依然受益匪浅。
通过对实验内容的理解和把握,我掌握图形输入和交互技术的基本方法,也掌握部分图形交互技术的实现方法。
同时,进一步熟练编程语言环境中图形绘制技术。
最重要的是加深了我对图形学的兴趣和认识。
希望在今后的学习中,我可以加强专业技能,早日攻破这些障碍。