1、vc可视化实验2实验二:MFC曲线绘制实验学号: 2011329700214 姓名:周咪咪 班级:11数媒(2)班一、 实验目的1.了解Windows图形处理的基本原理。2.掌握Windows图形和文本输出。二、 实验内容1.MFC曲线绘制实现三、 实验步骤及源代码1.创建MFC 应用程序框架打开VC6.0,使用MFC AppWizardexe向导创建MFC应用程序sy2框架,选择单文档应用程序,其它默认。 2.添加菜单项选择项目工作区的资源视图,展开menu文件夹,双击菜单资源IDR_MAINFRAME,打开菜单编辑器。在主菜单【帮助】的后面添加3 个菜单项【曲线】、【线宽】和【颜色】,并分
2、别给它们添加子菜单(设置其Caption(菜单项名称)、ID、Prompt(提示))。3.创建快捷菜单(1)在ResourceView菜单中右击Menu,选择Insert Menu,将新创建的资源命名为IDR_MENU_POP。然后按照要求为快捷菜单依次添加菜单项,将菜单项设置到对应的ID。(2)添加代码在sy2_1View.h中CSy2_1View 类内部添加如下代码,声明快捷菜单中对应的变量。CMenu m_PopMenu; /Pop_up快捷菜单在sy2_1View.cpp中添加如下代码:CSy2_1View:CSy2_1View() / TODO: add construction c
3、ode herem_PopMenu.LoadMenu(IDR_MENU_POP);/创建并加载菜单资源CSy2_1View:CSy2_1View()m_PopMenu.DestroyMenu();/释放菜单资源在ResourseView中的CSy2_1View选择WM_RBUTTONDOWN添加消息处理函数OnRButtonDown*().void CSy2_1View:OnRButtonDown(UINT nFlags, CPoint point) /新加消息处理函数 / TODO: Add your message handler code here and/or call default
4、 CMenu* m_pPop = NULL;/用m_pPop这个指针去获取m_Popmenu这个菜单 m_pPop=m_PopMenu.GetSubMenu(0); this-ClientToScreen(&point);/将坐标由客户坐标转化为屏幕坐标 m_pPop-TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);/显示菜单 CView:OnRButtonDown(nFlags, point);编译运行程序,结果如下:4.创建工具栏(1)首先单击ResourceView,选择Toolbar,然后单击鼠标右键,在弹出的快捷菜单中选择Inse
5、rt Toolbar,将新加入的工具条资源重新命名为IDR_TOOLBAR_NEW。绘制4个按钮,并设置相应ID。(2)添加代码在MainFrm,h中添加代码,声明一个CToolBar变量:CToolBar m_wndToolBarNew;/声明CToolBar变量,新建工具条在Main.Frm.cpp文件的CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)函数中添加代码:if (!m_wndToolBarNew.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP/先用Cr
6、eateEx函数创建一个工具条 | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) | !m_wndToolBarNew.LoadToolBar(IDR_TOOLBAR_NEW)/通过LoadToolBar函数将创建的工具条与指定资源(新建的工具条资源)绑定 TRACE0(Failed to create toolbarn); return -1; / fail to create 编译运行程序,结果如下:5.添加成员变量及成员函数(1)选择项目工作区中的类视图,右击CSy5View,光标移至添加,分别添加成员变量及
7、成员函数。 (2)在构造函数中初始化成员变量:Csy2View:Csy2View ()m_typ=0; /初始时窗口中不显示曲线m_col=RGB(0,0,0); /颜色初始为黑色m_wid=1; /线宽初始为1m_able=0; /初始时除“正弦”和“余弦”菜单项外,新增的其他菜单项均/为不可用(3)添加成员函数代码打开 sy2View.h 文件,在类的定义前面添加代码:const double PI=3.1416;打开 sy2View.cpp 文件,添加如下文件包含代码:#include math.h#include MainFrm.h为上表中各成员函数添加代码:double Csy25V
8、iew:calsin(int x)double y;y=sin(x*PI/180); /计算正弦return y;double Csy2View:calcos(int x)double y;y=cos(x*PI/180); /计算余弦return y;void Csy2View:drawline(CDC* pDC,int x1, int y1, int x2, int y2)pDC-MoveTo(x1,y1);pDC-LineTo(x2,y2);void Csy2View:drawaxis(CDC *pDC)/坐标函数CString str;CFont myfont,*oldfont;myfo
9、nt.CreatePointFont(80,Arial,pDC); /定义坐标刻度字体oldfont=pDC-SelectObject(&myfont);drawline(pDC,50,10,50,290); /绘制Y 轴drawline(pDC,45,150,780,150); /绘制X 轴for(int i=50;iTextOut(i,155,str); /输出X 轴上刻度值for(i=0;iTextOut(15,45+20*i,str);else pDC-TextOut(15,45+20*i,0);pDC-SelectObject(oldfont);myfont.DeleteObject
10、();void Csy2View:drawcurve(CDC* pDC)drawaxis(pDC); /调用成员函数绘制坐标系CPoint point750;CPen mypen,*oldpen;mypen.CreatePen(PS_SOLID,m_wid,m_col); /创建实线画笔、线宽及颜/色由参数m_wid 和m_col 确定oldpen=pDC-SelectObject(&mypen);for(int i=0;i722;i+)pointi.x=i+50;if(m_typ=1) /根据参数m_typ 的值确定曲线类型pointi.y=(int)(150-calsin(i)*100);
11、else if(m_typ=2)pointi.y=(int)(150-calcos(i)*100);for(i=0;iSelectObject(oldpen);mypen.DeleteObject();6.建立消息映射(1)分别为菜单项【正弦】、【余弦】、【线宽2】、【线宽3】、【红色】和【蓝色】添加COMMAND 及UPDATE_COMMAND_UI 消息处理函数。(2)添加代码在消息处理函数中添加如下代码:void Csy2View:OnSin()m_typ=1; /选择正弦曲线m_able=1; /不可用菜单项变为可用Invalidate(); /更新视窗void Csy2View:On
12、Cos()m_typ=2;m_able=1;Invalidate();void Csy2View:OnColr()m_col=RGB(255,0,0); /选择红色Invalidate();void Csy2View:OnColb()m_col=RGB(0,0,255);Invalidate();void CSy5View:OnWidsp2()m_wid=2; /设置线宽为2Invalidate();void Csy2View:OnWidsp3()m_wid=3;Invalidate();void Csy2View:OnUpdateColb(CCmdUI* pCmdUI)pCmdUI-Enab
13、le(m_able); /“红色”菜单项变为可用if(m_col=RGB(0,0,255)pCmdUI-SetCheck(true); /“红色”菜单项加标记elsepCmdUI-SetCheck(false);void CSy5View:OnUpdateColr(CCmdUI* pCmdUI)pCmdUI-Enable(m_able);if(m_col=RGB(255,0,0)pCmdUI-SetCheck(true);elsepCmdUI-SetCheck(false);void Csy2View:OnUpdateWidsp2(CCmdUI* pCmdUI)pCmdUI-Enable(m_
14、able);if(m_wid=2)pCmdUI-SetCheck(true);elsepCmdUI-SetCheck(false);void Csy2View:OnUpdateWidsp3(CCmdUI* pCmdUI)pCmdUI-Enable(m_able);if(m_wid=3)pCmdUI-SetCheck(true);elsepCmdUI-SetCheck(false);7.把drawcurve(pDC)添加到OnDraw(CDC* pDC)函数中实现坐标的绘制。void CSy2View:OnDraw(CDC* pDC) CSy2Doc* pDoc = GetDocument();
15、 ASSERT_VALID(pDoc); / TODO: add draw code for native data here drawcurve(pDC);/将drawcurve函数添加到Ondraw函数中,Ondraw是初始化画图8.添加状态栏操作代码(1)打开 MainFrm.cpp 文件,将系统默认的状态栏对象m_wndStatusBar 的访问类型改为Public。(2)在状态栏静态数组中添加ID_INDICATOR_PROMPT,并在字符串编辑器中设置其属性,手工建立ID_INDICATOR_PROMPT 的UPDATE_COMMAND_UI 消息映射。(3)首先,选择项目工作区的
16、ClassView 视图,双击CSy5View 类,打开其头文件Sy5View.h,在消息处理函数的声明宏中添加代码。afx_msg void OnUpdatePrompt(CCmdUI* pCmdUI);(4)然后,打开 Sy5View.cpp 文件,在其消息映射表中添加代码。ON_UPDATE_COMMAND_UI(ID_INDICATOR_PROMPT, OnUpdatePrompt);(5)最后,在 Sy5View.cpp 文件中给消息处理函数OnUpdatePrompt( )添加代码。 void CSy5View:OnUpdatePrompt(CCmdUI* pCmdUI)CMain
17、Frame *pMainFrame=(CMainFrame*)AfxGetMainWnd();CStatusBar *pStatusBar=&pMainFrame-m_wndStatusBar;/获取状态栏指针CString str,str1,str2,str3;str2=宽1,;str3=黑色;str1=(m_typ=1)?正弦,:余弦,;if(m_wid=2) /以下代码根据用户选择确定提示信息str2=宽2,;else if(m_wid=3)str2=宽3,;if(m_col=RGB(255,0,0)str3=红色;else if(m_col=RGB(0,0,255)str3=蓝色;st
18、r=str1+str2+str3;if(m_able=0) str=选择曲线类型; /初始时状态栏中提示信息pStatusBar-SetPaneText(1,str); /显示提示信息四、 运行结果及分析五、实验心得这次实验过程较多,老师给的实验步骤较具体。在此次实验中,了解到了MFC中菜单资源的使用,快捷菜单的创建及使用,工具条资源的创建及使用和字符串资源的使用。实验过程中,在快捷菜单的实现中花费的时间较多。不知道是程序原因还是软件自身的问题,实验中预编译若在老师报告中的位置将报错无法实现正常运行,需要改变其位置方能实现。在实验操作过程中,对于函数的使用及资源的使用仍有较大问题,希望在接下来的学习中能够熟练掌握。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1