VC实验二MFC曲线绘制实验.docx
《VC实验二MFC曲线绘制实验.docx》由会员分享,可在线阅读,更多相关《VC实验二MFC曲线绘制实验.docx(18页珍藏版)》请在冰点文库上搜索。
VC实验二MFC曲线绘制实验
实验二、MFC曲线绘制实验
班级:
姓名:
学号:
2.1实验目的
●了解Windows图形处理的基本原理。
●掌握Windows图形和文本输出。
2.2实验平台
●WindowsXPprofessional操作系统。
●VC6.0集成开发环境。
2.3实验内容
●MFC曲线绘制实现
2.4实验原理
●图形设备接口和接口环境
Windows是一个图形操作系统,Windows使用图形设备接口(GDI)进行图
形和文本输出,MFC封装了GDI对象,提供了CGdiObject类和CDC类支持图形和文本输出。
Windows引入GDI的主要目的是为了实现设备无关性。
所谓设备无关性,是指操作系统屏蔽了硬件设备的差异,使用户编程时一般无须考虑设备的类型。
应用程序可以使用GDI创建3种类型的图像:
1.适量图形:
如各种集合图形。
2.光栅图形:
指光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出。
3.文本:
以逻辑坐标为单位进行计算,Windows中的文本是按图形方式输出的。
1.设备环境(DeviceContext,DC)
为了体现Windows的设备无关性,应用程序的输出不直接面向显示器或打印机等物理设备,而是面向一个称之为设备环境(DeviceContext,DC)的虚拟逻辑设备。
设备环境,DC也称设备描述表或设备上下文。
设备环境DC是由GDI创建、用来代表设备连接的数据结构。
DC的主要功能有以下几种:
(1)允许应用程序使用一个输出设备。
(2)提供Windows应用程序、设备驱动和输出设备之间的连接。
(3)保存当前信息,例如当前的画笔、画刷、字体和位图等图形对象及其属性,以及颜色和背景等影响图形输出的绘图模式。
(4)保存窗口剪切区域(ClippingRegion),限制程序输出到输出设备中窗口覆盖的区域。
2.设备环境类CDC及其功能
设备环境类
功能描述
CDC
所有设备环境类的基类,对GDI的所有绘图函数进行了封装;可用来直接访问整个显示器或非显示设备(如打印机等)的上下文。
CPaintDC
CPaintDC用于响应窗口重绘消息(WM_PAINT)的绘图输出,不仅可对客户区进行操作,还可以对非客户区进行操作。
CClientDC
代表窗口客户区的设备环境,一般在响应非窗口消息并对客户区绘图时要用到该类。
CWindowDC
代表整个窗口的设备环境,包括客户区和非客户区;除非要自己绘制窗口边框和按钮,否则一般不用它。
CMetaFileDC
代表Windows图元文件的设备环境;一个Windows图元文件包括一系列的图形设备接口命令,可以通过重放这些命令来创建图形;对CMetaFileDC对象进行的各种绘制操作可以被记录到一个图元文件中。
3.设备环境类CDC的一些常用函数
4.颜色的设置
Windows用COLORREF类型的数据存放颜色,它实际上是一个32位整数。
任何一种颜色都是由红、绿、蓝3种基本颜色组成的,COLORREF类型数据的低位字节存放红色强度值,第2个字节存放绿色强度值,第3个字节存放蓝色强度值,高位字节为0,每一种颜色分量的取值范围为0~255。
直接设置COLORREF类型的数据不太方便。
MFC提供了RGB宏,用于设置颜色,它将其中的红、绿、蓝分量值转换为COLORREF类型的颜色数据,其使用形式为:
RGB(byRed,byGreen,byBlue)
其中参数byRed、byGreen和byBlue分别表示红、绿、蓝分量值(范围0~255)。
例如,
RGB(0,0,0)表示黑色,RGB(255,0,0)表示红色,RGB(0,255,0)表示绿色,RGB(0,0,255)表示
蓝色。
表3-3列出了一些常用颜色的RGB值。
很多涉及到颜色的GDI函数都需要使用COLORREF类型的参数,如设置背景色的成员函数CDC:
:
SetBkColor()、设置文本颜色的成员函数CDC:
:
SetTextColor()。
下面的代码说明如何使用RGB宏。
COLORREFrgbBkClr=RGB(192,192,192);//定义灰色
pDC->SetBkColor(rgbBkClr);//背景色为灰色
pDC->SetTextColor(RGB(0,0,255));//文本颜色为蓝色
5.获取设备环境
在一个MFC应用程序中获得DC的方法主要有两种:
一是接受一个参数为指向CDC对象的指针;二是声明一个MFC设备环境类的对象,并使用this指针为该对象赋值。
6.GDI对象CGdiObject
在默认状态下,当用户创建一个设备环境并在其中绘图时,系统使用设备环境默认的绘图工具及其属性。
如果要使用不同风格和颜色的绘图工具进行绘图,用户必须重新为设备环境设置自定义的画笔和画刷等绘图工具。
这些绘图工具统称为GDI对象。
GDI对象是Windows图形设备接口的抽象绘图工具。
除了画笔和画刷,其他GDI对象还包括字体、位图和调色板。
MFC对GDI对象进行了很好的封装,提供了封装GDI对象的类。
1.CPen类:
装GDI画笔。
用于绘制对象的边框以及直线和曲线。
默认的画笔用于绘制与一个像素等宽的黑色实线。
2.CBrush类:
装GDI画刷。
画刷是用来填充一个封闭图形对象(如矩形、圆形)的内部区域的,默认的画刷颜色是白色。
3.CFont类:
封装GDI字体对象。
用来绘制文本。
用户可以建立一种GDI字体,并使用CFont的成员函数来访问它。
主要用于设置文本输出的效果,包括文字的大小、是否加粗、是否斜体、是否加下划线等。
4.CBitmap类:
封装GDI位图。
提供成员函数装载和位图操作,位图可以用于填充区域。
5.CPalette类:
封装GDI调色板。
包含系统可用的色彩信息,是应用程序和彩色输出设备环境(如显示器)的接口。
6.CRgn类:
封装GDI区域。
区域是窗口内的一块多边形或椭圆形区域。
CRgn用于设备环境(通常是窗口)内的区域操作,通常和CDC类中与裁剪(clipping)有关的成员函数配合使用。
●画笔和画刷的使用
库存对象是由操作系统维护的、用于绘制屏幕的常用对象,包括库存画笔、画刷、字
体等。
使用SelectStockObject()函数可以直接选择库存对象,修改系统默认值。
如果选择
成功,函数SelectStockObject()将返回以前的CGdiObject对象的指针,需要将返回值转换
为相匹配的GDI对象的指针。
函数参数用于指定选择的是哪一种GDI库存对象,可直接
选用的库存对象见表:
2.5实验步骤
Ø创建MFC应用程序框架
打开VC6.0,使用MFCAppWizard[exe]向导创建MFC应用程序Sy5框架,选择单文档应用程序,其它默认。
Ø添加菜单项
选择项目工作区的资源视图,展开menu文件夹,双击菜单资源IDR_MAINFRAME,打开菜单编辑器。
在主菜单【帮助】的后面添加3个菜单项【曲线】、【线宽】和【颜色】,并分别给它们添加子菜单,如下图所示
Ø创建快捷菜单
为应用程序添加一个快捷菜单,并将快捷菜单的菜单项设置为菜单栏中的相应项,如下图所示:
Ø创建工具栏
为应用程序创建一个新的工具栏,并使工具栏上的各按钮与菜单栏中的菜单项相对应,如下图所示:
Ø添加代码
⏹添加成员变量及成员函数
选择项目工作区中的类视图,右击CSy5View,光标移至添加,分别添加成员变量及成员函数,见以下两个表:
在构造函数中初始化成员变量:
CSy5View:
:
CSy5View()
{
m_typ=0;//初始时窗口中不显示曲线
m_col=RGB(0,0,0);//颜色初始为黑色
m_wid=1;//线宽初始为1
m_able=0;//初始时除“正弦”和“余弦”菜单项外,新增的其他菜单项均//为不可用
}
⏹添加成员函数代码
打开Sy5View.h文件,在类的定义前面添加代码:
constdoublePI=3.1416;
打开Sy5View.cpp文件,添加如下文件包含代码:
#include"math.h"
#include"MainFrm.h"
为上表中各成员函数添加代码:
doubleCSy5View:
:
calsin(intx)
{
doubley;
y=sin(x*PI/180);//计算正弦
returny;
}
doubleCSy5View:
:
calcos(intx)
{
doubley;
y=cos(x*PI/180);//计算余弦
returny;
}
voidCSy5View:
:
drawline(CDC*pDC,intx1,inty1,intx2,inty2)
{
pDC->MoveTo(x1,y1);
pDC->LineTo(x2,y2);
}
voidCSy5View:
:
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();
}
voidCSy5View:
:
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();
}
⏹建立消息映射
分别为菜单项【正弦】、【余弦】、【线宽2】、【线宽3】、【红色】和【蓝色】添加COMMAND及UPDATE_COMMAND_UI消息处理函数,见下表:
在消息处理函数中添加如下代码:
voidCSy5View:
:
OnSin()
{
m_typ=1;//选择正弦曲线
m_able=1;//不可用菜单项变为可用
Invalidate();//更新视窗
}
voidCSy5View:
:
OnCos()
{
m_typ=2;
m_able=1;
Invalidate();
}
voidCSy5View:
:
OnColr()
{
m_col=RGB(255,0,0);//选择红色
Invalidate();
}
voidCSy5View:
:
OnColb()
{
m_col=RGB(0,0,255);
Invalidate();
}
voidCSy5View:
:
OnWidsp2()
{
m_wid=2;//设置线宽为2
Invalidate();
}
voidCSy5View:
:
OnWidsp3()
{
m_wid=3;
Invalidate();
}
voidCSy5View:
:
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);
}
voidCSy5View:
:
OnUpdateWidsp2(CCmdUI*pCmdUI)
{
pCmdUI->Enable(m_able);
if(m_wid==2)
pCmdUI->SetCheck(true);
else
pCmdUI->SetCheck(false);
}
voidCSy5View:
:
OnUpdateWidsp3(CCmdUI*pCmdUI)
{
pCmdUI->Enable(m_able);
if(m_wid==3)
pCmdUI->SetCheck(true);
else
pCmdUI->SetCheck(false);
}
⏹添加状态栏操作代码
打开MainFrm.cpp文件,将系统默认的状态栏对象m_wndStatusBar的访问类型改为Public。
在状态栏静态数组中添加ID_INDICATOR_PROMPT,并在字符串编辑器中设置其属性,手工建立ID_INDICATOR_PROMPT的UPDATE_COMMAND_UI消息映射。
首先,选择项目工作区的ClassView视图,双击CSy5View类,打开其头文件Sy5View.h,在消息处理函数的声明宏中添加代码。
afx_msgvoidOnUpdatePrompt(CCmdUI*pCmdUI);
然后,打开Sy5View.cpp文件,在其消息映射表中添加代码。
ON_UPDATE_COMMAND_UI(ID_INDICATOR_PROMPT,OnUpdatePrompt);
最后,在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);//显示提示信息
}
⏹编译、链接并运行程序。
2.6实验结果
●实验心得:
本次实验虽然实验要求上的步骤写得比较的详细,一步一步的按着操作加代码完成了差不多,但是也出现了一些错误,比较繁琐。