MFC图形与文本实验
- 格式:doc
- 大小:198.00 KB
- 文档页数:6
《面向对象课程设计》实验报告题目学生姓名学号专业班级指导老师20 年1月画图软件一.实验要求该程序设计是用MFC开发绘图软件。
此绘图软件可进行自由绘图和画规定图形,并能对图形进行颜色笔宽的编辑。
同时增加了添加背景与打开绘图文件的功能。
这个程序除了一般的绘制图形功能外还增加了自定义背景功能,使得用户可以简单便捷的进行切换背景操作,以达到美观的效果。
在背景上画图更加直接与便捷。
二、实验程序设计及结构1、需求分析(功能、类、成员)这个程序需要实现自由绘图的功能,并能绘制规定图形且能为图形变换颜色与笔宽。
其中主要在Cview类下进行操作。
其中成员函数有:afx_msg void Onfromfile(); //打开视图文件afx_msg void Onwidth2(); //设置笔宽2afx_msg void Oncolour(); //选择颜色afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //鼠标按下操作afx_msg void OnLButtonUp(UINT nFlags, CPoint point); //鼠标弹起操作afx_msg void OnMouseMove(UINT nFlags, CPoint point); //鼠标移动操作afx_msg void Onwidth3(); //设置笔宽3afx_msg void Onwidth4(); //设置笔宽10afx_msg void rect(); //画矩形afx_msg void cricle() //画圆afx_msg void selfdraw(); //自由绘图成员变量有:CString filename;COLORREF m_color;int m_penwidth;short m_show_type;bool m_flag;bool m_isbuttondown;CPoint m_oldpoint;int m_draw_type;CPoint m_draw_originpt;CPoint m_draw_oldpt;设计结构(包括总体结构和数据结构)i)总体结构程序有五个菜单项,选择颜色、选择笔宽、画规定图形、自由绘图、插入背景。
MFC字符输入实例讲解本文主要通过简单实例讲解,实现SDI中的视图窗口中实现字符的输入功能,主要是通过本文能够给MFC初学者一个相对简单的认知过程,希望能够给像我一样的菜鸟们一缕光明(好悲壮啊)!1.首先在VS2008内创建一个单文档(SDI)工程,起名为MyText,选择默认即可,编译完成效果如下:图12.接下来,请根据我的思路与我一起去思考!完成字符输入功能,首先我们需要一个光标(caret),因此第一步,我们需要实现光标的创建与现实!在视图类窗口(客户服务区)创建后,我们创建我们的光标,那么需要在哪里创建呢?对了!CMyTextView类中的消息WM_CREATE对应的OnCreate()函数中添加即可:int CMyTextView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: 在此添加您专用的创建代码CClientDC clientDC(this);//获取当前字体的度量信息TEXTMETRIC tm;clientDC.GetTextMetrics(&tm);//创建实体光标并显示CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);ShowCaret();return 0;}3.此时光标显示在左上角位置,且不能移动。
因此如何让光标移动到我们鼠标点击的位置呢?显然,我们要在视图类中相应WM_LBUTTONDOWN消息,编辑相应的代码:void CMyTextView::OnLButtonDown(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值SetCaretPos(point);m_point = point;CView::OnLButtonDown(nFlags, point);}4.下面应该是我们处理字符的阶段了!想实现字符输入,我们要敲键盘,那我们应该去响应那个消息?当然是WM_CHAR,编辑其相应的处理函数将是我们的主要工作。
实验四 MFC图形绘制编程实验一、实验目的(1) 熟悉Visual C++ 6.0开发环境;(2) 掌握MFC消息映射的操作步骤;(2) 掌握MFC图形输出的方法;(3) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。
二、实验内容请编写程序,要求如下:(1) 定义一支黄色画笔,绘制一条线段;(1) 定义一支紫色画笔,绘制一条多段线;(3) 定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;(4) 定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;(5) 定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。
三、实验报告1.列出图形绘制程序代码清单:(1)在头文件Demo.h中:#include "afxwin.h"class CDemoWnd:public CFrameWnd{public:CDemoWnd();~CDemoWnd();public:LRESULT OnPaint(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()public:int m_nX0;int m_nY0;int m_nX1;int m_nY1;};class CDemoApp:public CWinApp{public:BOOL InitInstance();};CDemoApp ThisApp;(2)在源文件Demo.cpp中:#include "tpd1.h"CDemoWnd::CDemoWnd(){m_nX0 = 0;m_nY0 = 0;m_nX1 = 0;m_nY1 = 0;}CDemoWnd::~CDemoWnd(){}BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)ON_MESSAGE(WM_PAINT,OnPaint)END_MESSAGE_MAP()LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam) {CPaintDC dc(this);CPen Pen1,*pOldPen1;Pen1.CreatePen(PS_SOLID,10,RGB(255,255,0));pOldPen1=dc.SelectObject(&Pen1);dc.SelectObject(&Pen1);dc.MoveTo(10,10);dc.LineTo(100,100);CPen Pen2,*pOldPen2;Pen2.CreatePen(PS_SOLID,4,RGB(255,0,255));pOldPen2=dc.SelectObject(&Pen2);dc.SelectObject(&Pen2);POINT pt1[]={{100,10},{10,180},{200,150}};dc.Polyline(pt1,3);CPen Pen3,*pOldPen3;dc.SelectStockObject(BLACK_BRUSH);Pen3.CreatePen(PS_SOLID,4,RGB(255,0,0));pOldPen3=dc.SelectObject(&Pen3);dc.SelectObject(&Pen3);dc.Rectangle(300,50,400,150);CPen Pen4,*pOldPen4;dc.SelectStockObject(GRAY_BRUSH);Pen4.CreatePen(PS_SOLID,4,RGB(0,255,0));pOldPen4=dc.SelectObject(&Pen4);dc.SelectObject(&Pen4);dc.Ellipse(500,200,700,400);CPen Pen5,*pOldPen5;Pen5.CreatePen(PS_SOLID,4,RGB(0,0,255));pOldPen5=dc.SelectObject(&Pen5);dc.SelectStockObject(DKGRAY_BRUSH);dc.SelectObject(&Pen5);POINT pt2[]={{250,250},{400,250},{475,379},{400,509},{250,509},{175,379}};dc.Polygon(pt2,6);return 0;}BOOL CDemoApp::InitInstance(){CDemoWnd *pMainWnd = new CDemoWnd();pMainWnd->Create(NULL,"Demo Mini-MFC");pMainWnd->ShowWindow(m_nCmdShow);pMainWnd->UpdateWindow();m_pMainWnd = pMainWnd;return TRUE;}2、程序运行结果:3、总结在MFC 程序中绘制图形的基本操作步骤:(1)获取图形设备接口。
VC++实验报告姓名:学号:学院:专业:指导老师:2012年6 月1日计算机与信息技术学院综合性、设计性实验报告专业:计算机科学与技术年级/班级:网络工程 2011-2012学年第二学期课程名称VC++程序设计实验指导教师本组成员学号姓名实验地点计算机机房实验时间5月8日上午8:00-11:30 5月15日上午8:00-11:30 5月22日上午8:00-11:30项目名称MFC基本应用程序的建立实验类型综合性(一)实验目的:1. 理解windows编程的特点2. 了解MFC应用程序的消息映射、数据映射、运行时类型检查和诊断信息转化机制。
3. 掌握用APPWizard(exe)创建SDI,MDI以及基于对话框的应用程序的方法4. 了解SDI、MDI在编程、功能等方面的异同。
5. 掌握使用项目工作区窗口的CLASS VIEW页面为一个类添加成员的方法。
6. 掌握用CLASS WIZARD映射消息的方法。
(二)实验仪器或设备:操作系统:Windows XP SP3处理器:Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz 2.50GHz内存:8.00GB(7.85GB可用)显卡:ATI HD6770 1G GDDR5独立显卡硬盘:500GVC ++6.0环境(三)总体设计(设计方案、设计流程及原理等)设计思想:启动Visual C++6.0;调入并运行Ex_HelloMFC.cpp;创建一个单文档应用程序Ex_MySDI;用ClassWizard映射消息;创建一个多文档应用程序Ex_MyMDI;向类添加成员函数和成员变量,设置断点并控制程序运行。
(四)实验步骤(包括主要步骤、代码分析等)1〉首先建立一个MFC单文本文档,编译运行能输出一个text空白文本文档,关闭文本文档,展开项目工作区窗口Class View中的所有类结点,然后单击CEx_SDIVew类结点,从弹出的快捷菜单中选择“Add Member Variable”添加两个成员变量,都设置为int型,两个分别命名为m_nLButton和m_nRButton,如下图:接着展开CEx_SDIView类结点的所有成员,双击构造函数CEx_SDIView()结点,会弹出一个提示添加成员变量初始化的程序,添加代码后程序为:2〉接着添加消息映射,这时先按Ctrw+W快捷打开“MFC ClassWizard”对话框。
简单画图程序【实验目的】本实验目的是通过构建基于MFC的windows画图程序,使学生:(1) 理解MFC应用程序的运行机制(2) 掌握使用MFC构建Windows应用程序的基本结构及编程的基本方法(3) 理解和掌握MFC应用程序消息处理机制及应用(4) 掌握类向导(ClassWizard)的使用【实验要求】(1) 必须做好实验原理的预习。
(2) 需要对提供的程序代码进行分析,并明确实验时还应在何处添加哪些语句。
【实验环境】Microsoft Windows XPMicrosoft Visual C++ 6.01 基本功能描述1) 在单文档菜单中,在菜单行中可插入一个菜单项,命名为绘图,在下拉菜单中可分别设置绘制的图形形状,如直线、矩形及椭圆,线宽选项,有1-5可供选择,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。
2) 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。
3) 增添工具栏,设置绘制的图形形状,线色以及填充色,可更方便地选择相应的功能。
2 设计思路1) 对需要用到的变量进行初始化。
2) 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。
选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。
3) 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。
4) 选择图形或其它属性,可进行下一次绘制。
图1 程序流程图3 软件设计3.1 设计步骤1)创建单文档创建一个MFC AppWizard[exe]工程,命名为“yinshuyan”,如图2所示,并创建单文档,如图3所示。
MFC单文档基础训练——文本输出、绘图等平台为:VS20101.一个简单的单文档应用程序文件->新建项目->MFC应用程序,出现窗口按“下一步”,出现下面窗口选择单文档点"调试—>运行",最后运行界面为下图:一个简单的单文档应用程序向导自动建立五个类:向导自动建立的类相应源文件其他源文件相应头文件其他头文件CAboutDlg StdAfx.cpp StdAfx.h CXxxApp Xxx.cpp Xxx.rc Xxx.h Resource.h CXxxView XxxView.cpp XxxView.hCXxxDoc XxxDoc.cpp XxxDoc.h每个类的主要函数:void CAboutDlg::DoDataExchange(CDataExchange* pDX)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)//创建窗体的工具栏,状态栏等BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)BOOL CXxxApp::InitInstance()void CXxxApp::OnAppAbout()BOOL CXxxDoc::OnNewDocument()//初始化文档字符数据、字体信息等void CXxxDoc::Serialize(CArchive& ar)BOOL CXxxView::PreCreateWindow(CREATESTRUCT& cs)void CXxxView::OnDraw(CDC* pDC)BOOL CXxxView::OnPreparePrinting(CPrintInfo* pInfo)//弹出打印对话框void CXxxView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)void CXxxView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)CXxxDoc* CXxxView::GetDocument() // non-debug version is inline创建单文档应用程序的一般步骤:●利用AppWizard创建应用程序框架●在文档内中声明保存文档数据所需要数据对象●完成文档类的OnNewDocument函数,初始化新文档●完成文档类的Serialize函数,保持和加载文档数据●完成视类的OnInitialUpdate函数,初始化显示●完成视类的OnDraw函数,显示当前文档内容●在视类中加入可以使用户编辑文档数据所需的代码2.简单文本和图形输出建立一个简单的单文档应用程序SimpleTextPicture,通过修改OnDraw函数在视(View)中输出信息或画图。
2.文本编辑应用示例首先创建一个基于对话框的应用程序,取工程文件名为:ch2.dsp。
即在新建文件的New 对话框中,选中Project 页,然后选择 MFC AppWizard(exe)选项,在Project name 框中输入:ch2。
在生成的对话框中删除[TODO:在这里设置对话控制。
]静态框和[取消]按钮,并将[确认]按钮的文本改为[返回]。
如图2-1所示。
图2-12.1对话框界面设计1.添加文本编辑框文本编辑框操作步骤如下:(1)添加文本编辑框,用于输入文件名。
选定控件工具栏中文本编辑按钮(Edit Box),本编辑框,并调整至合适的大小;(2)设置文本编辑框属性。
用鼠标右击该文本编辑框,在出现的菜单中选择属性(Properyies)菜单项,弹出属性对话框;(3)选择控件的标识符。
在属性对话框中选择General页,并确认ID 框中的标识符为:IDC_EDIT1,其余属性均维持默认状态;(4)单击属性对话框右上角的关闭按钮,关闭属性对话框;(5)按上述步骤制作右下部的文本编辑框,用于输入查找字符串,并确认其标识符为:IDC_EDIT2。
2.添加格式文本编辑框格式文本编辑框操作步骤如下:(1)选定控件工具栏中格式文本编辑按钮(Rich Edit),拖曳出一个格式文本编辑框,并调整至合适的大小;(2)打开其属性(Rich Edit Properties),在General页中确认标识符为:IDC_RICHEDIT1,同时在Styles页中进行设置(如图2-2所示)。
图2-23.添加按钮和静态框为对话框添加[打开]、[保存]、[查找] 3个按钮,它们的标识符分别为:IDC_BUTTON1、IDC_BUTTON2 和IDC_BUTTON3。
通过类向导或双击3个按钮的图标,为CCh3_2Dlg类加载OnButton1( )、OnButton2( ) 、OnButton3( ) 3个响应函数,分别完成打开文件、保存文件和查找字符串功能。
数学与计算科学系学生实验报告实验课程名称:计算机图形学实验内容:实验一 MFC基本绘图系别:年级:专业班:学生姓名:学号:开课时间:年下学期一、实验要求1. 按照教材第40页2.2节所介绍的操作步骤,熟悉MFC应用程序的创建过程,并完成第50页的例2-5。
2.在上面程序的基础上,通过设置不同的画笔和画刷,至少实现8个不同图形的绘制,如:椭圆、矩形、实线、虚线、位图显示、五角星(多边形)、圆弧、扇形、Bezier曲线等等。
二、实验过程1.启动Visval 6.0++,创建MFC单文档工程。
2. 在MFC的OnDraw(CDC* pDC)中“ // TODO: add draw code for native data here”下进行编程。
3.建立直角坐标系,并标出x,y轴和原点O。
4.在坐标系里画图。
5.用图片填充背景时要先将图片导入MFCresources中。
6.画五角星时在头文件中加入以下代码:#include "math.h"#define PI 3.1415926#define Round(d) int(floor(d+0.5))三、程序代码void CMywork1View::OnDraw(CDC* pDC){CMywork1Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCRect rect;//定义矩阵GetClientRect(&rect);//获得客户区矩阵pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式pDC->SetWindowExt(100,100);//设置窗口pDC->SetViewportExt(100,100);//设置视区:x轴水平向右为正,y轴垂直向上为正pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//设置客户区中心为坐标系原点rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);//客户区矩阵校正//建立坐标系CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0));//画实线,选择绿色画笔pOldPen=pDC->SelectObject(&NewPen);pDC->MoveTo(-rect.right,0); //自定义坐标轴pDC->LineTo(rect.right,0);pDC->MoveTo(0,-rect.bottom);pDC->LineTo(0,rect.bottom);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,-7);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,7);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(7,10-rect.bottom);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(-7,10-rect.bottom);pDC->TextOut(rect.right-15,5,"x"); //显示x轴pDC->TextOut(25,15-rect.bottom,"y"); //显示y轴pDC->TextOut(-15,10,"O"); //显示原点//直线---画实线1CPoint A(50,50),B(450,300);CPen NewPen1,*pOldPen1;NewPen1.CreatePen(PS_SOLID,1,RGB(0,225,225));//画实线,选择青色画笔pOldPen1=pDC->SelectObject(&NewPen1);pDC->MoveTo(A);pDC->LineTo(B);pDC->SelectObject(pOldPen1);pDC->TextOut(50,50,'A');pDC->TextOut(450,300,'B');pDC->TextOut(200,200,"实线");//直线---画虚线2CPoint C(300,150),D(600,100);CPen NewPen2,*pOldPen2;NewPen2.CreatePen(PS_DASH,1,RGB(225,0,0));//画虚线,选择红色画笔pOldPen2=pDC->SelectObject(&NewPen2);pDC->MoveTo(C);pDC->LineTo(D);pDC->SelectObject(pOldPen2);pDC->TextOut(300,150,'C');pDC->TextOut(600,100,'D');pDC->TextOut(450,100,"虚线");//画椭圆3rect.DeflateRect(100,50);CBrush * pOldBrush3;pOldBrush3=(CBrush *)pDC->SelectStockObject(NULL_BRUSH);//选择透明画刷pDC->Ellipse(rect);//绘制椭圆pDC->SelectObject(pOldBrush3);//画圆角矩形4CBrush NewBrush4,*pOldBrush4;NewBrush4.CreateSolidBrush(RGB(255,0,0));pOldBrush4=pDC->SelectObject(&NewBrush4);pDC->RoundRect(-400,-200,-50,-40,40,20);pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush4);//画Bezier样条9CPoint pp[7];pp[0]=CPoint(20,-200);pp[1]=CPoint(90,-70);pp[2]=CPoint(220,-30);pp[3]=CPoint(250,-160);double a=(pp[3].y-pp[2].y)/(pp[3].x-pp[2].x);double x=270,y=a*(x-pp[3].x)+pp[3].y;pp[4]=CPoint(Round(x),Round(y));pp[5]=CPoint(480,-130);pp[6]=CPoint(400,-25);for(int j=0;j<7;j++){if(0==j)pDC->MoveTo(pp[j]);elsepDC->LineTo(pp[j]);pDC->Ellipse(pp[j].x-5,pp[j].y-5,pp[j].x+5,pp[j].y+5);//黑色实心圆绘制控制点}CPen NewPen9,*pOldPen9;NewPen9.CreatePen(PS_SOLID,3,RGB(255,0,0));//红色画笔绘制样条pOldPen9=pDC->SelectObject(&NewPen9);pDC->PolyBezier(pp,7);//绘制Bezier样条pDC->SelectObject(pOldPen9);pDC->TextOut(280,-100,"Bezier曲线");//绘制五角星6CPen penBlue(PS_SOLID,5,RGB(0,0,255));//定义五个像素宽的蓝色画笔CPen *pOldPen6=pDC->SelectObject(&penBlue);CBrush brushRed(RGB(255,0,0));//定义红色画笔CBrush * pOldBrush6=pDC->SelectObject(&brushRed);pDC->SetPolyFillMode(WINDING);//设置填充模式int r=200;//正五边形外接圆的半径CPoint p[5];//定义正五边形顶点数组double Beta=2*PI/5;//定义每个顶点的圆心角double Alpha=PI/10;//定义起始角for(int i=0;i<5;i++){p[i].x=Round(r*cos(i*Beta+Alpha));//计算正五边形顶点坐标p[i].y=Round(r*sin(i*Beta+Alpha));}CPoint v[5];//定义五角星顶点数组v[0]=p[0];v[1]=p[2];v[2]=p[4];v[3]=p[1];v[4]=p[3];//转储顶点pDC->Polygon(v,5);//绘制五角星pDC->SelectObject(pOldPen6);//恢复画笔pDC->SelectObject(pOldBrush6);//恢复画刷//画扇形7CBitmap NewBitmap7; CBrush NewBrush7,*pOldBrush7;NewBrush7.CreatePatternBrush(&NewBitmap7);//将背景图作为画刷填充扇形pOldBrush7=pDC->SelectObject(&NewBrush7);CPen *pOldPen7;pOldPen7=(CPen*)pDC->SelectStockObject(NULL_PEN);CPoint ld,rt,sp,ep;ld=CPoint(500,150),rt=CPoint(100,300);//第一个扇形的位置sp=CPoint(-100,-300),ep=CPoint(-500,-150);pDC->Pie(CRect(ld,rt),sp,ep);//画扇形函数CBrush Brush7;Brush7.CreateSolidBrush(RGB(0,255,255));//为下面的的扇形配青色pDC->SelectObject(&Brush7);ld=CPoint(-400,-170),rt=CPoint(-300,-130);//第二个扇形的位置sp=CPoint(-200,-100),ep=CPoint(-500,-100);pDC->Pie(CRect(ld,rt),sp,ep);//画获取像素图8srand((unsigned)time(NULL));//随机变量(随时间变化)COLORREF crColor;int m,n;for(n=50;n<100;n++)for(m=-100;m<-50;m++)pDC->SetPixelV(m,n,RGB(rand()%256,rand()%256,rand()%256));//生成随机像素点for(n=50;n<100;n++)for(m=-100;m<-50;m++){crColor=pDC->GetPixel(m,n);//获取原矩形区域的像素点pDC->SetPixelV(m-200,n+50,crColor);//用获取的像素点在y-90的位置生成原图}}四、实验结果。
实验2 Visual C++ MFC的图形绘制一、实验目的1.了解Windows应用程序的特点。
2.掌握MFC类库中CDC类绘图函数的使用方法。
3.使用VisualC++开发简单Windows程序。
二、实验内容利用VisualC++6.0设计一个简易绘图板,完成简单的绘图功能。
三、实验指导1. 带菜单界面制作新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。
为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。
当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。
添加的六个菜单项的ID及名称如表1所示。
然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应,这六个响应函数的名称分别如表1所示。
在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。
因此在CGraphicView类中添加一个私有变量m_nDrawType;用来保存用户的选择,该变量的定义如下所述:private: UINT m_nDrawType;接着,在视类的构造函数中将此变量初始化为0,程序代码如下:CGraphicView::CGraphicView(){// TODO: add construction code herem_nDrawType=0;}利用switch/case语句,来分别完成相应图形的绘制。
当用户选择【绘图】菜单下的不同子菜单项时,将变量m_nDrawType设置为不同的值。
程序代码如下:void CGraphicView::OnDot(){// TODO: Add your command handler code herem_nDrawType=1;}void CGraphicView::OnLine(){// TODO: Add your command handler code herem_nDrawType=2;}void CGraphicView::OnRectangle(){// TODO: Add your command handler code herem_nDrawType=3;}void CGraphicView::OnEllipse(){// TODO: Add your command handler code herem_nDrawType=4;}void CGraphicView::OnShanxing(){// TODO: Add your command handler code herem_nDrawType=5;}void CGraphicView::OnLianxuxian(){// TODO: Add your command handler code herem_nDrawType=6;}2. 点、直线、矩形、椭圆的绘制对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。
实验二图形与文本一、实验目的和要求1、了解CDC类的使用2、掌握常用绘图函数的使用3、学会设置字体4、掌握画笔和画刷的使用5、了解不同文本输出函数的用法二、实验内容1、编写程序Sy2_1,在客户区显示一行文本,要求文本颜色为红色、背景为黄色。
如下图所示:代码如下void CSy2_1View::OnDraw(CDC* pDC){CSy2_1Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data herepDC->SetTextColor(RGB(255,0,0));pDC->SetBkColor(RGB(255,255,0));pDC->TextOut(20,30,"红色字体,黄色背景!");}2、编写一个应用程序Sy2_2,在客户区使用不同的画笔和画刷绘制点、折线、曲线、圆角矩形、弧、扇形和多边形等几何图形。
如图代码如下:void CSy2_2View::OnDraw(CDC* pDC){CSy2_2Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCPen *penOld,penNew;CBrush *brushOld,brushNew;penNew.CreatePen(PS_SOLID,5,RGB(255,0,0));pDC->SelectObject(&penNew);pDC->SetPixel(CPoint(100,100),RGB(255,0,0));pDC->MoveTo(150,70);pDC->LineTo(300,100);pDC->LineTo(400,240);pDC->LineTo(200,270);pDC->MoveTo(500,100);pDC->Arc(20,200,200,300,200,250,20,200);pDC->RoundRect(450,100,600,200,30,30);pDC->Arc(100,300,300,500,300,400,200,300);pDC->MoveTo(300,400);pDC->LineTo(200,400);pDC->MoveTo(200,300);pDC->LineTo(200,400);POINT pt[6]={{400,300},{500,300},{550,385},{500,460},{400,460},{350,385},};pDC->Polygon(pt,6);}3、编写Sy2_3,利用函数CreateFontIndirect()创建黑色字体,字体高度为30像素,宽度为25像素,并利用函数DrawText()在客户区以该字体输出文本“VC++”。
基于MFC的绘图软件目录基于MFC的绘图软件11 .引言 (2)2.MFC设备上下文及绘图的基本理论知识 (2)2.1 GDI(Graphic Device Interface)绘图的实现 (2)2.2 MFC图形对象类 (2)2.3 库存的GDI对象 (3)2.4与绘图有关的简单数据类型 (4)2.5 MFC应用程序框架中的图形绘制和刷新 (5)3.设计的主体内容MFC设备描述表---CDC类 (5)3.1 CDC类及其派生类 (5)3.2 文本输出 (6)3.3CDC常用的绘图函数 (6)3.4画笔和画刷 (8)4.软件主体设计 (8)4.1 资源编辑 (8)4.2 具体实现 (11)5.结果分析与讨论 (19)6.总结 (19)附录:简单绘图软件作品说明............................................ 错误!未定义书签。
1 .引言计算机的发展也是计算机语言的发展得到了很大的提高,人们的生活中离不开图像,除了我们可以用铅笔在纸上画图外,我们也可以在电脑上绘制我们的想象,本实验就是基于VC++的一个小型的绘图软件,虽然麻雀虽小五脏俱全。
本课题就是要实现这一小小的软件。
2.MFC 设备上下文及绘图的基本理论知识2.1 GDI(Graphic Device Interface)绘图的实现图形设备接口(GDI )可以理解为一个可执行程序,它处理来自windows 应用程序的图形函数调用,然后把这些调用传递给合适的设备驱动程序,由设备驱动程构关系如下:设备描述表(DC )是一种windows 数据结构,它包含了与一个设备(如显示器)的绘制属性的相关信息。
所有的绘制操作通过一个设备上下文对象进行,该对象封装了实现绘制线条,形状和文本的windows API 函数。
设备上下文可以用来向屏幕,打印机和图元件输入结果。
2.2 MFC 图形对象类Windows 提供了多种用于在设备描述表中进行绘图的图形对象,如画笔,位图,调色板,区域,和路径等。
实验二图形与文本
一、实验目的和要求
1、了解CDC类的使用
2、掌握常用绘图函数的使用
3、学会设置字体
4、掌握画笔和画刷的使用
5、了解不同文本输出函数的用法
二、实验内容
1、编写程序Sy2_1,在客户区显示一行文本,要求文本颜色为红色、背景为黄色。
如下图所示:
代码如下
void CSy2_1View::OnDraw(CDC* pDC)
{
CSy2_1Doc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
// TODO: add draw code for native data here
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(255,255,0));
pDC->TextOut(20,30,"红色字体,黄色背景!");
}
2、编写一个应用程序Sy2_2,在客户区使用不同的画笔和画刷绘制点、折线、曲线、圆角矩形、弧、扇形和多边形等几何图形。
如图
代码如下:
void CSy2_2View::OnDraw(CDC* pDC)
{
CSy2_2Doc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
// TODO: add draw code for native data here
CPen *penOld,penNew;
CBrush *brushOld,brushNew;
penNew.CreatePen(PS_SOLID,5,RGB(255,0,0));
pDC->SelectObject(&penNew);
pDC->SetPixel(CPoint(100,100),RGB(255,0,0));
pDC->MoveTo(150,70);
pDC->LineTo(300,100);
pDC->LineTo(400,240);
pDC->LineTo(200,270);
pDC->MoveTo(500,100);
pDC->Arc(20,200,200,300,200,250,20,200);
pDC->RoundRect(450,100,600,200,30,30);
pDC->Arc(100,300,300,500,300,400,200,300);
pDC->MoveTo(300,400);
pDC->LineTo(200,400);
pDC->MoveTo(200,300);
pDC->LineTo(200,400);
POINT pt[6]={{400,300},{500,300},{550,385},{500,460},{400,460},{350,385},};
pDC->Polygon(pt,6);
}
3、编写Sy2_3,利用函数CreateFontIndirect()创建黑色字体,字体高度为30像素,宽度为25像素,并利用函数DrawText()在客户区以该字体输出文本“VC++”。
如图
代码如下:
void CSy2_3View::OnDraw(CDC* pDC)
{
CSy2_3Doc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
// TODO: add draw code for native data here
CRect rect;
rect.SetRect(CPoint(50,60),CPoint(300,200));
CFont*OldFont,NewFont;
LOGFONT MyFont={
30,25,0,0,0,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,
"黑体"
};
NewFont.CreateFontIndirect(&MyFont);
OldFont=pDC->SelectObject(&NewFont);
pDC->DrawText("VC++",&rect,DT_WORDBREAK|DT_CENTER);
NewFont.DeleteObject();
}
4、编写单文档应用程序Sy2_4,在视图中显示三个圆,通过使用不同颜色的画笔及画刷来模拟交通红绿灯。
如图:
代码如下:
void CSy2_4View::OnDraw(CDC* pDC)
{
CSy2_4Doc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
// TODO: add draw code for native data here
CPen *OldPen,NewPen;
CBrush *OldBrush,NewBrush;
COLORREF rgb[]={RGB(255,0,0),RGB(255,255,0),RGB(0,255,0)};
for(int i=0;i<3;i++){
NewBrush.CreateSolidBrush(rgb[i]);
OldBrush=pDC->SelectObject(&NewBrush);
pDC->Ellipse(70+100*i,70,150+100*i,150);
NewBrush.DeleteObject();
}
}
5、编写程序Sy2_5,实现一行文本水平滚动显示,要求每个周期文本为红、黄两种颜色,字体为宋、楷两种字体。
如图
代码如下:
void CSy2_5View::OnDraw(CDC* pDC)
{
CSy2_5Doc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
// TODO: add draw code for native data here
CFont *OldFont,NewFont;
if(flag%2==0)
{
pDC->SetTextColor(RGB(255,0,0));
NewFont.CreatePointFont(200,"宋体",NULL);
}
if(flag%2==1)
{
pDC->SetTextColor(RGB(255,255,0));
NewFont.CreatePointFont(200,"楷体",NULL);
}
OldFont=pDC->SelectObject(&NewFont);
pDC->TextOut(x,50,"漂移");
pDC->SelectObject (OldFont);
SetTimer(1,10,NULL);
NewFont.DeleteObject();
}
void CSy2_5View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
x++;
CClientDC dc(this);
CRect rect;
GetClientRect(&rect);
if(x>=rect.right)
{
x=0;
flag++;
}
Invalidate();
CView::OnTimer(nIDEvent);
}
三、实验总结
这次的实验做的时间有点长,不过收获还是蛮多的,比如如何设置文本的字体、颜色等属性。
其中很关键的是通过第五个实验使我了解到OnTimer()函数的用法以及对Invalidate()函数的使用。