vc可视化实验2.docx
《vc可视化实验2.docx》由会员分享,可在线阅读,更多相关《vc可视化实验2.docx(15页珍藏版)》请在冰豆网上搜索。
vc可视化实验2
实验二:
MFC曲线绘制实验
学号:
2011329700214姓名:
周咪咪班级:
11数媒
(2)班
一、实验目的
1.了解Windows图形处理的基本原理。
2.掌握Windows图形和文本输出。
二、实验内容
1.MFC曲线绘制实现
三、实验步骤及源代码
1.创建MFC应用程序框架
打开VC6.0,使用MFCAppWizard[exe]向导创建MFC应用程序sy2框架,选择单文档应用程序,其它默认。
2.添加菜单项
选择项目工作区的资源视图,展开menu文件夹,双击菜单资源IDR_MAINFRAME,打开菜单编辑器。
在主菜单【帮助】的后面添加3个菜单项【曲线】、【线宽】和【颜色】,并分别给它们添加子菜单(设置其Caption(菜单项名称)、ID、Prompt(提示))。
3.创建快捷菜单
(1)在ResourceView菜单中右击Menu,选择InsertMenu,将新创建的资源命名为IDR_MENU_POP。
然后按照要求为快捷菜单依次添加菜单项,将菜单项设置到对应的ID。
(2)添加代码
在sy2_1View.h中CSy2_1View类内部添加如下代码,声明快捷菜单中对应的变量。
CMenum_PopMenu;//Pop_up快捷菜单
在sy2_1View.cpp中添加如下代码:
CSy2_1View:
:
CSy2_1View()
{
//TODO:
addconstructioncodehere
m_PopMenu.LoadMenu(IDR_MENU_POP);//创建并加载菜单资源
}
CSy2_1View:
:
~CSy2_1View()
{
m_PopMenu.DestroyMenu();//释放菜单资源
}
在ResourseView中的CSy2_1View选择WM_RBUTTONDOWN添加消息处理函数OnRButtonDown*().
voidCSy2_1View:
:
OnRButtonDown(UINTnFlags,CPointpoint)//新加消息处理函数
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
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,然后单击鼠标右键,在弹出的快捷菜单中选择InsertToolbar,将新加入的工具条资源重新命名为IDR_TOOLBAR_NEW。
绘制4个按钮,并设置相应ID。
(2)添加代码
在MainFrm,h中添加代码,声明一个CToolBar变量:
CToolBarm_wndToolBarNew;//声明CToolBar变量,新建工具条
在Main.Frm.cpp文件的CMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)函数中添加代码:
if(!
m_wndToolBarNew.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP//先用CreateEx函数创建一个工具条
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBarNew.LoadToolBar(IDR_TOOLBAR_NEW))//通过LoadToolBar函数将创建的工具条与指定资源(新建的工具条资源)绑定
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate
}
编译运行程序,结果如下:
5.添加成员变量及成员函数
(1)选择项目工作区中的类视图,右击CSy5View,光标移至添加,分别添加成员变量及成员函数。
(2)在构造函数中初始化成员变量:
Csy2View:
:
Csy2View()
{
m_typ=0;//初始时窗口中不显示曲线
m_col=RGB(0,0,0);//颜色初始为黑色
m_wid=1;//线宽初始为1
m_able=0;//初始时除“正弦”和“余弦”菜单项外,新增的其他菜单项均//为不可用
}
(3)添加成员函数代码
打开sy2View.h文件,在类的定义前面添加代码:
constdoublePI=3.1416;
打开sy2View.cpp文件,添加如下文件包含代码:
#include"math.h"
#include"MainFrm.h"
为上表中各成员函数添加代码:
doubleCsy25View:
:
calsin(intx)
{
doubley;
y=sin(x*PI/180);//计算正弦
returny;
}
doubleCsy2View:
:
calcos(intx)
{
doubley;
y=cos(x*PI/180);//计算余弦
returny;
}
voidCsy2View:
:
drawline(CDC*pDC,intx1,inty1,intx2,inty2)
{
pDC->MoveTo(x1,y1);
pDC->LineTo(x2,y2);
}
voidCsy2View:
:
drawaxis(CDC*pDC)//坐标函数
{
CStringstr;
CFontmyfont,*oldfont;
myfont.CreatePointFont(80,"Arial",pDC);//定义坐标刻度字体
oldfont=pDC->SelectObject(&myfont);
drawline(pDC,50,10,50,290);//绘制Y轴
drawline(pDC,45,150,780,150);//绘制X轴
for(inti=50;i<780;i=i+90)
{
drawline(pDC,i,145,i,150);//绘制X轴上刻度线
str.Format("%d",i-50);
if((i-50)!
=0)pDC->TextOut(i,155,str);//输出X轴上刻度值
}
for(i=0;i<11;i++)//绘制Y轴上刻度线,输出刻度值
{
drawline(pDC,50,50+20*i,55,50+20*i);
str.Format("%.2f",1-0.2*i);
if(i!
=5)pDC->TextOut(15,45+20*i,str);
elsepDC->TextOut(15,45+20*i,"0");
}
pDC->SelectObject(oldfont);
myfont.DeleteObject();
}
voidCsy2View:
:
drawcurve(CDC*pDC)
{
drawaxis(pDC);//调用成员函数绘制坐标系
CPointpoint[750];
CPenmypen,*oldpen;
mypen.CreatePen(PS_SOLID,m_wid,m_col);//创建实线画笔、线宽及颜//色由参数m_wid和m_col确定
oldpen=pDC->SelectObject(&mypen);
for(inti=0;i<722;i++)
{
point[i].x=i+50;
if(m_typ==1)//根据参数m_typ的值确定曲线类型
point[i].y=(int)(150-calsin(i)*100);
elseif(m_typ==2)
point[i].y=(int)(150-calcos(i)*100);
}
for(i=0;i<721;i++)
drawline(pDC,point[i].x,point[i].y,point[i+1].x,point[i+1].y);
//调用函数绘制曲线
pDC->SelectObject(oldpen);
mypen.DeleteObject();
}
6.建立消息映射
(1)分别为菜单项【正弦】、【余弦】、【线宽2】、【线宽3】、【红色】和【蓝色】添加COMMAND及UPDATE_COMMAND_UI消息处理函数。
(2)添加代码
在消息处理函数中添加如下代码:
voidCsy2View:
:
OnSin()
{
m_typ=1;//选择正弦曲线
m_able=1;//不可用菜单项变为可用
Invalidate();//更新视窗
}
voidCsy2View:
:
OnCos()
{
m_typ=2;
m_able=1;
Invalidate();
}
voidCsy2View:
:
OnColr()
{
m_col=RGB(255,0,0);//选择红色
Invalidate();
}
voidCsy2View:
:
OnColb()
{
m_col=RGB(0,0,255);
Invalidate();
}
voidCSy5View:
:
OnWidsp2()
{
m_wid=2;//设置线宽为2
Invalidate();
}
voidCsy2View:
:
OnWidsp3()
{
m_wid=3;
Invalidate();
}
voidCsy2View:
:
OnUpdateColb(CCmdUI*pCmdUI)
{
pCmdUI->Enable(m_able);//“红色”菜单项变为可用
if(m_col==RGB(0,0,255))
pCmdUI->SetCheck(true);//“红色”菜单项加标记
else
pCmdUI->SetCheck(false);
}
voidCSy5View:
:
OnUpdateColr(CCmdUI*pCmdUI)
{
pCmdUI->Enable(m_able);
if(m_col==RGB(255,0,0))
pCmdUI->SetCheck(true);
else
pCmdUI->SetCheck(false);
}
voidCsy2View:
:
OnUpdateWidsp2(CCmdUI*pCmdUI)
{
pCmdUI->Enable(m_able);
if(m_wid==2)
pCmdUI->SetCheck(true);
else
pCmdUI->SetCheck(false);
}
voidCsy2View:
:
OnUpdateWidsp3(CCmdUI*pCmdUI)
{
pCmdUI->Enable(m_able);
if(m_wid==3)
pCmdUI->SetCheck(true);
else
pCmdUI->SetCheck(false);
}
7.把drawcurve(pDC)添加到OnDraw(CDC*pDC)函数中实现坐标的绘制。
voidCSy2View:
:
OnDraw(CDC*pDC)
{
CSy2Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
drawcurve(pDC);//将drawcurve函数添加到Ondraw函数中,Ondraw是初始化画图
}
8.添加状态栏操作代码
(1)打开MainFrm.cpp文件,将系统默认的状态栏对象m_wndStatusBar的访问类型改为Public。
(2)在状态栏静态数组中添加ID_INDICATOR_PROMPT,并在字符串编辑器中设置其属性,手工建立ID_INDICATOR_PROMPT的UPDATE_COMMAND_UI消息映射。
(3)首先,选择项目工作区的ClassView视图,双击CSy5View类,打开其头文件Sy5View.h,在消息处理函数的声明宏中添加代码。
afx_msgvoidOnUpdatePrompt(CCmdUI*pCmdUI);
(4)然后,打开Sy5View.cpp文件,在其消息映射表中添加代码。
ON_UPDATE_COMMAND_UI(ID_INDICATOR_PROMPT,OnUpdatePrompt);
(5)最后,在Sy5View.cpp文件中给消息处理函数OnUpdatePrompt()添加代码。
voidCSy5View:
:
OnUpdatePrompt(CCmdUI*pCmdUI)
{
CMainFrame*pMainFrame=(CMainFrame*)AfxGetMainWnd();
CStatusBar*pStatusBar=&pMainFrame->m_wndStatusBar;
//获取状态栏指针
CStringstr,str1,str2,str3;
str2="宽1,";
str3="黑色";
str1=(m_typ==1)?
"正弦,":
"余弦,";
if(m_wid==2)//以下代码根据用户选择确定提示信息
str2="宽2,";
elseif(m_wid==3)
str2="宽3,";
if(m_col==RGB(255,0,0))
str3="红色";
elseif(m_col==RGB(0,0,255))
str3="蓝色";
str=str1+str2+str3;
if(m_able==0)str="选择曲线类型";//初始时状态栏中提示信息
pStatusBar->SetPaneText(1,str);//显示提示信息
}
四、运行结果及分析
五、实验心得
这次实验过程较多,老师给的实验步骤较具体。
在此次实验中,了解到了MFC中菜单资源的使用,快捷菜单的创建及使用,工具条资源的创建及使用和字符串资源的使用。
实验过程中,在快捷菜单的实现中花费的时间较多。
不知道是程序原因还是软件自身的问题,实验中预编译若在老师报告中的位置将报错无法实现正常运行,需要改变其位置方能实现。
在实验操作过程中,对于函数的使用及资源的使用仍有较大问题,希望在接下来的学习中能够熟练掌握。