mfc绘图程序上机步骤

合集下载

VC中MFC绘图详细教程

VC中MFC绘图详细教程
休息 14
前一页
休息
字体对象 CFont NewFont; (2)创建字体
CreateFont( int nheight,int nWidth,//高,宽 int nEscapement, //每行文字相以于页底的角 int nOrienation, //每个….. DWORD nWeight , //字体粗细 DWORD dwltalic, //非零表示倾斜 DWORD dwUnderline, //非零表示下划线 DWORD dwStrikeout, //非零表示中划线 DWORD dwCharset, //字符集 DWORD dwOutputPrecision, //输出精度 DWORD dwClipPrecision, //剪裁精度 DWORD dwQuality, //输出质量 DWORD dwPitchAndFamily, //字体系列 lpszFaceName//字体名称} ; 前一页 DWORD 休息
4
休息
设备环境
设 备 环 境




获取设备环境 (1)使用GetDC()函数 CDC *CWnd GetDC() int ReleaseDC(CDC * pDC ) (2)直接构造CDC对象 用声明一个CDC类或其派生类对象的方式来 获取设备环境 CClientDC dc(CWnd *)
前一页
休息
3
设备环境

设 备 环 境

前一页
(1)CWindowDC 和CClientDC CPaintDC区别 CWindowDC提供客户区和非客户区画图的设备环 境;坐标原点在屏幕左上角 CClientDC CPaintDC提供画图的设备环境;坐标原 点在客户区左上角 (2) CClientDC 和CPaintDC区别 CPaintDC是响应WM_PAINT消息,用在OnPaint() 函数中;只支持屏幕显示 CClientDC不响应WM_PAINT消息,只担负此时的 绘图工作;支持屏幕显示,也支持打印 CDC常用函数(参见MSDN)

MFC画图程序步骤

MFC画图程序步骤

MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开辟Windows应用程序的C++类库。

在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。

下面是使用MFC创建一个简单的画图程序的步骤。

步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。

在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。

输入项目名称并选择保存的位置。

在应用程序类型中,选择“单文档”或者“多文档”视图,具体根据你的需求而定。

点击“确定”按钮创建项目。

步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。

在资源视图中,双击IDD_DIALOG(或者其他对话框资源)以打开对话框编辑器。

在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。

在画图程序中,你可以添加一个画布控件来显示绘制的图形。

步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。

打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。

MFC02_Visual Studio C++ MFC简单绘图程序

MFC02_Visual Studio C++ MFC简单绘图程序

Visual studio C++ MFC 简单绘图程序-绘制国际象棋棋盘功能:由Button将绘制的棋盘显示于Picture Control中一、建立一个MFC功程序:1.启动Visual Studio C++;2.新建一个MFC对话框项目:New|Project|MFCAplication;中输入mfc_pic,然后点|OK;4.在Welcome to the MFC Application窗口:点next;5.在Application Type窗口:点dialoge base;然后点Finish;出现如图所示的窗口;6.删除窗口中的TODO…文本对象;二、向窗口添加一个Picture Control和一个Button共二个对象:1.修改Button的Caption属性为“绘制棋盘”,ID属性为IDC_BUTTON_DRAR;2.修改Picture Control的ID属性为IDC_PIC,建立关联变量名为picD;3.双击Button,添加如下代码:voidCmfcpicDlg::OnBnClickedButton1(){CRect r;intw,h,dxy,i,j;CWnd *pic = GetDlgItem(IDC_PIC); //取Picture的长宽信息GetDlgItem(IDC_PIC)->GetWindowRect(&r);w=r.Width();h=r.Height();dxy=(w<h?w:h)/8; //棋盘由8*8个方格组成CDC *pdc = pic->GetDC();pdc->Rectangle(r);CBrushmyBrush;pdc->Rectangle(0,0,8*dxy,8*dxy); //绘制外框线myBrush.CreateSolidBrush(RGB(0,0,0));for(i=0;i<8;i++){for(j=i%2;j<8;j+=2){r.left=i*dxy;r.top=j*dxy;r.right=(i+1)*dxy;r.bottom=(j+1)*dxy;pdc->FillRect(r,&myBrush); //绘制黑方格}}}4.为使图形美观,初始化图形大小为8的倍数,只需在BOOL Cmfc_picDlg::OnInitDialog()函数的定义体内“// TODO: Add extra initialization here”处加入如下代码即可;GetDlgItem(IDC_PIC)->MoveWindow(25,25,240,240,true);三、运行程序:按F5运行程序,得到如图所示的结果。

MFC 一个简单的绘图程序

MFC 一个简单的绘图程序

MFC 一个简单的绘图程序涉及到的知识点:1. 鼠标信息的处理,2. 文档和视图的关系,3. 新建一个类及其使用方法的技巧,4. 改变窗口大小或者刷新窗口后原来所绘制的图形没有显示出来的问题。

绘制图形的原理:鼠标被用作画笔,绘图过程中要进行不同的鼠标消息的处理,如按下鼠标,移动鼠标和释放鼠标。

当用户按下鼠标左键是必须记录鼠标当前的位置,并捕获鼠标,设置光标形状;当移动鼠标时,先判断鼠标左键是否同时被按住,如果是则从上一个鼠标位置到当前鼠标位置绘制一条直线。

并保存当前鼠标位置点,供绘制下一段直线用,当释放鼠标左键时将鼠标释放给系统。

一、简单绘图程序程序的实现1.使用MFC AppWizard 应用程序向导创建一个SDI应用程序MyDraw,在视图类CMyDrawView.h中添加如下代码:protected: // create from serialization onlyCMyDrawView();DECLARE_DYNCREATE(CMyDrawView)CPoint m_ptOrigin; //起始点坐标bool m_bDragging; //鼠标是否处于拖拽状态标记HCURSOR m_hCross;//拖拽状态时鼠标的样式2. 在构造函数中对拖拽标记和鼠标样式进行初始化CMyDrawView::CMyDrawView(){// TODO: add construction code herem_bDragging=false;//初始化为falsem_hCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//十字光标}3. 使用类向导为视图类添加按下鼠标左键,移动鼠标,释放鼠标左键的消息处理函数。

代码分别为:void CMyDrawView::OnLButtonDown(UINT nFlags, CPoint point) //按下鼠标左键{// TODO: Add your message handler code here and/or call default SetCapture();::SetCursor(m_hCross);m_ptOrigin=point;m_bDragging=true;CView::OnLButtonDown(nFlags, point);}void CMyDrawView::OnLButtonUp(UINT nFlags, CPoint point) //释放鼠标左键{ // TODO: Add your message handler code here and/or calldefault if(m_bDragging){m_bDragging=false;ReleaseCapture();}CView::OnLButtonUp(nFlags, point);}void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point) //移动鼠标{// TODO: Add your message handler code here and/or callif(m_bDragging){//CMyDrawDoc * pDoc=GetDocument();//ASSERT_VALID(pDoc);//pDoc->AddLine(m_ptOrigin,point);CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin=point;}CView::OnMouseMove(nFlags, point);}4.在MyDraw.CPP中设置窗口标题m_pMainWnd->SetWindowText("简单的绘图程序");此后,编译、链接,运行程序后可以将鼠标当作一个画笔绘制曲线了。

基于MFC的简单画图程序实验

基于MFC的简单画图程序实验

简单画图程序【实验目的】本实验目的是通过构建基于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画板程序教程-图文

MFC画板程序教程-图文

MFC画板程序教程-图文第四章屏幕绘图4.1、MFC绘图的基本知识4.1.1、设备描述表(deviceconte某t)的概念绝大多数的Window应用程序都要向不同的输出设备(打印机、屏幕)上绘制文本和图形。

由于Window是一个具有与设备无关性的操作系统,所以任何向屏幕上进行输出的功能都要间接地通过一个叫做设备描述表DC(deviceconte某t)的对象(简称为DC对象)来完成。

用户向设备描述表对象提出输出的要求,然后由Window自己来调用具体输出设备的驱动程序,及完成实际的输出工作。

使用设备描述表带来的最大的好处就是输出格式的一致性,因为输出不再是直接针对具体的设备,而是通过统一格式的设备描述表间接地实现。

设备描述表实际上是一种Window的数据结构,它保存了设备(打印机、屏幕等)的绘图属性和绘图函数。

设备描述表对象就是设备描述表数据结构的一个具体的实例,它提供了一个绘图的环境,所有的绘图工作都要通过它来实现。

MFC提供了不同类型的设备描述表类,每一个类都封装了代表Window设备描述表的句柄(HDC)和函数。

因此,使用MFC获取设备描述表的操作比使用WindowAPI方法容易的多。

围绕设备描述表,MFC还提供了一系列与其配合使用的绘图工具对象,这其中包括:画笔对象、刷子对象以及字体对象等等。

它们的工作流程是这样的:首先对设备描述表进行设置,即获取设备描述表对象;然后选择进行输出所需要的绘图工具;最后用设备描述表对象的输出函数绘制图形。

4.1.2、窗口、客户区和非客户区的概念窗口是Window应用程序基本的操作单元,是其运行及与用户进行交互的基本平台。

屏幕输出的目标一般都是窗口内的客户区,它不包括窗口的边框、水平和垂直滚动条、状态条、工具条、菜单栏和标题栏。

窗口内的客户区是一个万能的输出区域,可以接受无论是图形、文本、位图、还是其他类型的数据(例如OLE对象)。

窗口内除客户区之外的区域即为非客户区。

MFC绘图基础——上机操作步骤

MFC绘图基础——上机操作步骤

MFC绘图基础——上机操作步骤⼀、上机之前的介绍软件环境:VC++6.0⽬的:熟悉基本的MFC框架搭建和了解界⾯⼆、MFC上机操作步骤1,在Windows桌⾯上运⾏VC++6.0。

2,新建项⽬⼯程⽂件。

3,在MFC 应⽤程序向导-步骤1 对话框中,选中单⽂档单选按钮,其余保持默认。

4,弹出新建⼯程信息的对话框,单击确定。

5,完成上述步骤后,⼯程Testone的MFC框架已经⽣成。

6,在集成开发环境的左侧⼯作窗⼝中有3个标签页。

ClassView 显⽰所创建的类和成员函数ResourceView 显⽰所创建的资源FileView 显⽰程序⽂件,主要包括程序源⽂件、头⽂件和资源⽂件7,在CTestView 类的源⽂件TestView.cpp中可以找到成员函数OnDraw()。

其内容如下:void CTestoneView::OnDraw(CDC* pDC){CTestoneDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here}其中pDC定义为CDC类的指针。

pDoc通过GetDocument()函数得到了指向⽂档类CTestoneDoc的指针。

ASSERT_VALID(pDoc)函数使pDoc指针有效。

使⽤pDC指针,可以对CDC类的成员函数进⾏操作。

注意:OnDraw()函数是由系统框架直接调⽤的,每当窗⼝重绘时就会⾃动执⾏。

8,单击⼯具条上的按钮,就可以直接编译、运⾏程序。

三、结束语⾄此,尽管未编写⼀⾏代码,但Test⼯程已经形成⼀个可执⾏程序的框架了。

以后的⼯作就是针对具体的设计任务,为该框架添加⾃⼰的程序代码。

接下来就是Coding~~~。

【计算机图形学课程】一.MFC基本绘图函数使用方法

【计算机图形学课程】一.MFC基本绘图函数使用方法

【计算机图形学课程】⼀.MFC基本绘图函数使⽤⽅法这是最近我《计算机图形学》课程实践编程课介绍的相关知识,主要是想通过MFC C++绘图,让学⽣体会下图形学相关的编程及简单的图形绘制,同时⾮常佩服学⽣的想象⼒,他们做得真的不错。

希望这篇基础⽂章对你有所帮助吧!尤其是有这门课程的学⽣或编程爱好者,如果⽂章存在错误或不⾜之处,还请海涵。

参考书籍:孔令德·《计算机图形学基础教程(Visual C++版)》学⽣绘制的图形还是⾮常有创新的,表⽰很满意,哈哈哈~⼀. MFC绘图基础知识 CDC类PS:这部分主要引⼊孔令德⽼师的知识,这篇⽂章以后⾯的编程为主。

VC++具有强⼤的绘图功能,虽然基于对话框的应⽤我推荐⼤家使⽤C# Winform程序,但是计算机图形和图像的基础知识,还是强烈推荐使⽤VC++ MFC实现。

这有助于让你深⼊的理解图形变换、图像处理等知识。

在Windows平台下,GDI(Graphics Device Interface)图形设备接⼝被抽象为上下⽂CDC类(Device Context,DC)。

Windows平台直接接收图形数据信息的不是显⽰器和打印机等硬件设备,⽽是CDC对象。

MFC中,CDC类定义设备上下⽂对象的基类,封装了所需的成员函数,调⽤CDC类的成员函数,绘制和打印图形及⽂字。

CDC类派⽣出CClientDC类、CMetaFileDC类、CPaintDC类和CWindowDC类,请读者⾃⾏学习,同时推荐阅读原书。

MFC常⽤CPoint、CRect、CSize等数据类型。

(1) CPoint类:存放点坐标(x,y);(2) CRect类:存放矩形左上顶点和右下⾓顶点的坐标(top、left、right、bottom),其中(top,left)为矩形的左上⾓点,(right,bottom)为矩形的右下⾓点;(3) CSzie类:存放矩形的宽度和⾼度的坐标(cx,cy),其中cx为矩形的宽度,cy为矩形的⾼度。

实验一 MFC基本绘图

实验一 MFC基本绘图

数学与计算科学系学生实验报告实验课程名称:计算机图形学实验内容:实验一 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的位置生成原图}}四、实验结果。

绘图上机指导书

绘图上机指导书

绘图上机指导书一个应用画笔例子步骤1.选择向导MFC AppWizard(exe),创建一个名为DrawLine的项目.在MFC AppWizard 对话框的第一步中选择单文档.步骤 2.在VC++中,选择Workspace中的Class View,展开CMainFrame类,双击PreCreateWindow(CREATESTRUCT& cs),添加如下代码.BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){ if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;cs.x=0; cs.y=0;cs.cx=::GetSystemMetrics(SM_CXSCREEN);cs.cy=::GetSystemMetrics(SM_CYSCREEN)-25;return TRUE;}步骤3.为CDrawLineView类添加公有成员变量int m_x,m_y;步骤4. 在VC++6.0中,单击“查看—建立类向导”菜单,打开MFC ClassWizard对话框,选中Message Maps选项卡,确保Class Name为CDrawLineView,在Object IDs栏中选中CDrawLineView ,在Messages栏中选中WM_SIZE,单击“Add Function”按钮。

即完成CDrawLineView::OnSize成员函数的添加。

void CDrawLineView::OnSize(UINT nType, int cx, int cy){ C View::OnSize(nType, cx, cy);m_x=cx;m_y=cy;}步骤 5.在VC++中,选择Workspace中的Class View,展开CDrawLineView类,双击OnDraw(CDC* pDC)添加如下代码.void CDrawLineView::OnDraw(CDC* pDC){ CDrawLineDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);int y,y0; COLORREF color;for(y=0;y<m_y/3;y++){ color = RGB(y+255-m_y/3,0,0);CPen newpen ; newpen.CreatePen(PS_SOLID,1,color);CPen *OldPen = pDC->SelectObject(&newpen);pDC->MoveTo(0,y); pDC->LineTo(m_x,y);pDC->SelectObject(OldPen); }步骤6. 单击菜单“编译、执行”运行程序.一个应用画刷例子步骤1.选择向导MFC AppWizard(exe),创建一个名为DrawLine2的项目.在MFC AppWizard 对话框的第一步中选择单文档.步骤2.在VC++中,选择Workspace中的Class View,展开CDrawLine2View类,双击OnDraw(CDC* pDC)添加如下代码.void CDrawLine2View::OnDraw(CDC* pDC){ CPen NewPen(PS_SOLID,2,RGB(255,0,0));//创建画笔CPen *OldPen=(CPen*)pDC->SelectObject(&NewPen);CBrush *OldBrush=(CBrush*)pDC->SelectStockObject(BLACK_BRUSH);pDC->MoveTo(50,50); //画线pDC->LineTo(150,50); //画一个三角形pDC->LineTo(100,137);pDC->LineTo(50,50);pDC->Arc(63,137,138,212,100,137,100,137);//画一个圆pDC->Ellipse(163,137,238,212);pDC->Rectangle(213,212,287,250);//画一个长方形pDC->RoundRect(213,100,287,137,20,20);//画一个圆角长方形pDC->SelectObject(OldPen);pDC->SelectObject(OldBrush);}步骤3. 单击菜单“编译、执行”运行程序.一个文本输出例子步骤1.选择向导MFC AppWizard(exe),创建一个名为Font的项目.在MFC AppWizard 对话框的第一步中选择单文档.步骤2.在VC++中,选择Workspace中的Class View,展开CFontView类,双击OnDraw(CDC* pDC)添加如下代码.void CFontView::OnDraw(CDC* pDC){TEXTMETRIC tm; //定义一个TEXTMETRIC结构,用以记录字体信息int X=0,Y=0;char lpsz_1[]="这是一行红色、字体为SYSTEM_FONT文字,红色代表未来。

MFC图形界面编程入门教程

MFC图形界面编程入门教程

MFC图形‎界面编程入‎门教程MFC(Micro‎soft Found‎a tion‎Class‎e s)是微软提供‎的用于简化‎编程的一个‎类库,其使用面向‎对象的思想‎将W ind‎o ws的图‎形界面编程‎接口封装到‎若干个类中‎,并且提供了‎一个可视化‎的编程环境‎,方便的程序‎员的开发。

使用MFC‎可以方便地‎创建基于对‎话框或文档‎视图的程序‎,在其上添加‎各种控件(按钮、编辑框等等‎),通过消息映‎射机制使控‎件操作和某‎个函数对应‎起来。

第一章如何添加按‎钮和编辑框‎工程文件见‎:演示工程.rar新建工程到现在,我们的工作‎都是在资源‎编辑器里完‎成的,主要针对的‎是界面方面‎。

下面我们将‎为按钮添加‎一些处理代‎码,比如弹出一‎个对话框,显示我们在‎编辑框里输‎入的文字。

点击OK,完成添加变‎量操作。

下面添加按‎钮的响应函‎数右击按钮,选择建立类‎向导,弹出的对话‎框要求我们‎为按钮响应‎函数取个名‎字。

我们将函数‎名设为On‎S how,点击OK后‎,可以看到C‎l assW‎i zard‎对话框下半‎部分多了一‎行信息,双击它或者‎点击右边的‎E di t Code按‎钮就在里面添加‎如下代码:Updat‎e Data‎(TRUE);AfxMe‎s sage‎B ox(m_mys‎t ring‎);这两个函数‎都是由MF‎C提供的。

调用Upd‎a teDa‎t a(TRUE)将我们在编‎辑框输入的‎文本更新到‎其对应的变‎量中(即m_my‎strin‎g),AfxMe‎s sage‎B ox(m_mys‎t ring‎)可以将变量‎的内容显示‎到消息框中‎。

现在编译运‎行程序,在编辑框中‎如入一些内‎容,点击显示按‎钮,效果如下:第二章点名程序中‎的控件工程文件见‎:点名程序工‎程.rar编辑框学号和姓名‎的显示使用‎了只读的编‎辑框,和普通编辑‎框的添加方‎式相同,只读属性可‎以在其属性‎中设置(右下):与前面的例‎子不同的还‎有其是用于‎显示文本而‎输入文本,下拉列表我们使用了‎下拉列表来‎选择班级。

mfc绘图程序上机步骤

mfc绘图程序上机步骤

mfc绘图程序上机步骤首先生成MFC程序空框架空框架中的每个类的职责是什么要自己理解清楚第一次课:1.定义自己的数据类CLine直线类,用于绘图点击菜单:插入—类选择Generic class,输入类名,每个类都是分成两个文件.h 中只有类体,包含类的数据成员定义和成员函数声明,.cpp中就是成员函数的类体外实现classCLine{int x1,y1,x2,y2;public:CLine(int a=0,int b=0,int c=0,int d=0);virtual ~CLine();int Getx1();int Gety1();int Getx2();int Gety2();void SetPoint1(intx,int y);很多函数是在后面使用中发现问题逐渐添加的void SetPoint2(intx,int y);};2.自定义的类要作为数据成员出现在Doc类中classCSmallCADDoc : public CDocument{protected: // create from serialization onlyCSmallCADDoc();DECLARE_DYNCREATE(CSmallCADDoc)// Attributespublic:CLine line1; //数据成员应该是私有,但是由于文档类与视图类交换频繁,为了访问方便,直接定义成公有了。

你也可以定义成私有,再定义一个Get函数间接访问,取他的值3.注意:添加了这个数据成员后,需要增加几个#include “Line.h”语句添加的原则是,每个cpp文件都单独编译,哪里用到新的类,相应的cpp前就要增加#include “。

”语句此处是在CSmallCADDoc类中添加了一个CLine line1;类对象,在SmallCADDoc.h文件中。

所以,凡是包含了#include “SmallCADDoc.h”的地方都要在前面添加#include “Line.h”语句。

mfc简单绘图程序

mfc简单绘图程序

M F C简单的绘图程序-—王帅目录摘要 (2)关键字 (2)1 引言 (2)设计目的 ............................................................................................................... 错误!未定义书签。

2 功能说明 (2)2。

1菜单栏...................................................................................................... 错误!未定义书签。

2.1.1图形 (3)2.1。

2画笔 (4)2.1.3画硬币 (4)2。

2工具栏 (5)2.3状态栏 (5)3 功能的实现 (5)3。

1 视图设计 (5)3。

2 编辑资源 (6)3.3 编程思路及各个函数的实现 (7)(1)思路 (7)(2)代码的实现 (7)1.为基本形状创建一个基类 (8)2.基本形状类的创建 (8)2.1矩形类的创建及定义 (8)2.2圆形类的创建及定义 (10)2。

3正五边形类的创建及定义 (11)2。

4正三角形类的创建及定义 (14)2。

5椭圆类的创建及定义 (16)2。

6正四边形类的创建及的定义 (17)2.7正六边形类的创建及定义 (18)2。

8直线类的创建及定义 (19)3。

各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20)3。

1矩形类的调用与与绘图的实现 (20)3.2圆形类的调用 (24)3。

3正三角形类的调用 (25)3.4基本类型调用的剩余代码 (26)4。

画笔的使用、颜色及大小的调整 (29)5。

画硬币 (35)6.工具栏中的自定义控件 (38)7。

状态栏中的显示 (39)4程序功能的测试 (41)5最后总结 (42)摘要:本绘图程序能够进行基本图形的绘画,如直线,圆,矩形,三角形等等,并且在此基础上添加了多边形的绘画,如正五边形等。

第二章 MFC 绘图基础

第二章 MFC 绘图基础
全部展开FileView标签页后,显示如图2-7所示的内 容。本书后续的编程过程中一般使用的是CTestView类 的TestView.h头文件和TestView.cpp源文件。
图2-7 FileView标签页的展开显示
在CTestView类的源文件TestView.cpp中可以找到 OnDraw()函数。其内容如下:
void CTestView::OnDraw(CDC* pDC) {
CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here }
➢ pDC定义为CDC类的指针。 ➢ pDoc通过GetDocument()函数得到指向文档类CTestDoc的指
图2-4 New Project Information 对话 框
5. 完成上述步骤后,Test工程的MFC应用程序框架已经 生成。如图2-5所示。
图2-5 应用程序框架
6. 在应用程序框架的ClassView标签页中显示所创建 的类和成员函数;在ResourceView标签页板中显示
所创建的资源;在FileView标签页中显示源程序文件。 如图2-6所示。
CMetaFileDC类:
Windows图元文件设备上下文类。 •CMetaFileDC 封 装 了 在 Windows 中 绘 制 图 元 文 件 的 方法。 •图元文件是微软定义的一种Windows平台下的与设备 无关的的图形文件格式(扩展名为wmf),其所占的 磁盘空间比其它任何格式的图形文件都要小得多。 •wmf格式文件通常用于存储一系列由绘图命令所描述 的图形(如绘制直线与文本等) 。 •在 建 立 图 元 文 件 时 , 不 能 实 现 即 绘 即 得 , 而 是 先 将 GDI调用记录在图元文件中,然后在GDI环境中重新执 行图元文件,才可显示图像。

MFC实现简单画图形程序

MFC实现简单画图形程序

《MFC编程及应用》课程设计报告题目:简单画图形程序学号:姓名:指导老师:时间:程序设计步骤:一、建立基于对话框的应用程序框架;二、CMy0910200155Dlg类中关键新增变量的作用:CPtrArray pta; //用于保存已绘图形的相关信息。

CMemoryNode *pmN; //指向CMemoryNode类的指针,程序运行过程中动态保存对象信息。

CMemoryNode *pmn; //指向CMemoryNode类的指针,从文件中读取信息时动态创建类的对象。

COLORREF m_CurrentBrushColor; //用于存放当前画刷的颜色。

COLORREF m_CurrentPenColor; //用于存放当前画笔的颜色。

int num; //用于存放从"Index.txt"文件中读取的数字。

int flag=0; //用于标识:当为1时,表示按下了”画图”按钮;当为2时,表示按下了”撤消”按钮;当为3时,表示按下了”加载历史”按钮,则从文件中读取信息。

int mark; //用于标识:当为0时,表示刚画过矩形;当为1时,表示刚画过圆角矩形;当为2时,表示刚画过椭圆。

int index; //用于存放pta数组的容量。

int flag1=0; //用于标识,和flag搭配,用来处理多种情况下的窗口重绘问题。

int ButtonState=0; //用于标识,是类CShow和类CMy0910200155Dlg的一个接口,通过其值在1和0之间转换,来处理弹出式对话框的初次绘制和移动时的重绘问题。

三、CMemoryNode类中变量的作用:COLORREF BrushColor;COLORREF PenColor;int Mark; //以上三者为类CMemoryNode的成员变量,分别用来保存绘图时画刷颜色,画笔颜色和形状。

四、与控件相关联的变量:CComboBox m_BrushColor; //指示画刷颜色组合框。

MFC绘图版 软件说明书.

MFC绘图版 软件说明书.

广西工学院计算机工程系《Windows程序设计》课程设计说明书课题名称:学生姓名:学号:班级:指导教师:完成日期:年月日目录1.问题陈述及其软件功能概述.............................................P 2.总体设计………………………………………………….P 3.详细设计和部分程序代码………………………...……..P 4.运行结果及分析………………………………………….P 5.总结……………………………………………………….P1.问题陈述及其软件功能概述1.1问题陈述本次课程设计,我所选择的题目是<多功能绘图软件>。

面临以下主要几个问题:1)如何用鼠标进行画图?2)如何绘制一下几种图形,线,带箭头的线,任意线,圆,椭圆,矩形?3)如何在内存中保存以上几种图形?4)如何将图形保存到文件中去?5)如何从文件中读取以前画过的图形?面临以下几个次要的问题:1)如何选择绘画的类型?2)如何改变画笔的颜色和宽度和形状?3)如何实现图形的橡皮条功能?4)如何实现图形中的透明画刷功能?5)如何实现图形的重绘?6)如何实现画图工具栏?7)如何实现状态栏鼠标坐标显示和当前时间显示?8)如何打开txt文档以及如何改变显示文本的字体?9)如何打开bmp文件?10) 如何打开wav文件?1.2软件功能概述软件主要有以下几个主要功能1)用鼠标可以绘制图形,包括一下几种:直线,带箭头的线,任意线,圆形,椭圆,矩形。

2)可以对画笔进行设置:画笔的颜色,画笔的线宽,画笔的形状。

3)可以保存所有的图形到内存中,所有图形绘制后,拉动窗口发生重绘不改变。

4)可以将所有绘制的图形保存到文件中,并且可以读取。

5)可以“新建”空白绘图文档。

6)可以查看最近打开的文档。

7)可以打印用户绘制好后的图形,打印预览你绘制的图形。

8)可以完成一部分的“撤消”功能,(注:任意曲线的图形绘制撤消不能实现)9)可以完成图形“清空”功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
原来所有对line1的操作,都改为对list1
3.为了链表链接,Cline类加Cline* next;数据,和SetNext、GetNext函数
4.改OnDraw,从画一个直线变为遍历链表画多个直线
CLine* p=pDoc->list1.Gethead();
while(p!=0)
{
pDC->MoveTo(p->Getx1(),p->Gety1());
CLine line1;//数据成员是文档类的,它不像dos下程序,明确能看到定义,调用构造函数。Mfc程序在后台默认有个初始化过程,所以各个类的数据成员最好都要默认初始化。比如CLine构造函数加缺省参数CLine(int a=0,int b=0,int c=0,int d=0);或者CSmallCADDoc类构造函数加数据成员初始化均可
// Attributes
public:
CLine line1;//数据成员应该是私有,但是由于文档类与视图类交换频繁,为了访问方便,直接定义成公有了。你也可以定义成私有,再定义一个Get函数间接访问,取他的值
3.注意:添加了这个数据成员后,需要增加几个#include“Line.h”语句
添加的原则是,每个cpp文件都单独编译,哪里用到新的类,相应的cpp前就要增加#include“。。。”语句
ASSERT_VALID(pDoc);
pDoc->line1.SetPoint1(point.x,point.y);
3.OnLButtonUp和OnMouseMove函数中
{
// TODO: Add your message handler code here and/or call default
pDoc->list1.insert(p);
//Invalidate();
step=1;
}
OnLButtonUp和OnMouseMove函数中
pDoc->list1.Gethead()->SetPoint2(point.x,point.y);改当前直线的第2点并重画
Invalidate();
作业:回去自己再加几个链表类
CSmallCADDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(graphtype==1&&step==0)//添加判断条件
{
pDoc->line1.SetPoint1(point.x,point.y);
pDoc->line1.SetPoint2(point.x,point.y);
CSmallCADDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->line1.SetPoint2(point.x,point.y);
4.发现问题:由于操作时鼠标总是移动,所以OnMouseMove函数不加控制会随时响应
修改:增加一个step,控制绘图步骤,作为view类的数据成员,初始化为0
6.第一次作业加了几个图形类,由于所有的绘图都是用鼠标,如何区分?用到菜单
添加菜单,添加菜单响应函数。在View类中加一个数据成员graphtype用来区分画不同的图
class CSmallCADView : public CScrollView
{
private:
int graphtype;//当前绘制的图形的类型0--没有绘图1--直线2---椭圆。。。
2.void CSmallCADView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call default
CSmallCADDoc* pDoc = GetDocument();
public:
CLineList();
virtual ~CLineList();
void insert(CLine* p);
CLine * Gethead();
};
2.修改doc类数据
CLineline1;唯一的一条直线变成一个链表CLineList list1;
注意加了新类就要加#include语句多处
{
int x1,y1,x2,y2;
public:
CLine(int a=0,int b=0,int c=0,int d=0);
virtual ~CLine();
int Getx1();
int Gety1();
int Getx2();
int Gety2();
void SetPoint1(int x,int y);很多函数是在后面使用中发现问题逐渐添加的
pDC->LineTo(p->Getx2(),p->Gety2());
p=p->next;
}
5.改鼠标响应函数
OnLButtonDown函数中
if(graphtype==1&&step==0)//画直线
{
CLine *p=new CLine(point.x,point.y,point.x,point.y);生成一个新直线节点,插入链表
CSmallCADDoc::CSmallCADDoc():line1(100,100,300,500)
5.开始绘图:
View类的OnDraw函数
//画直线
pDC->MoveTo(pDoc->line1.Getx1(),pDoc->line1.Gety1());
pDC->LineTo(pDoc->line1.Getx2(),pDoc->line1.Gety2());
首先生成MFC程序空框架
空框架中的每个类的职责是什么要自己理解清楚
第一次课:
1.定义自己的数据类CLine直线类,用于绘图
点击菜单:插入—类
选择Generic class,输入类名,每个类都是分成两个文件.h中只有类体,包含类的数据成员定义和成员函数声明,.cpp中就是成员函数的类体外实现
class CLine
OnLButtonDown中,if(step==0)才取第一点,取完step=1
OnLButtonUp中if(step==1)才取第2点,
OnMouseMove函数中if(step==1)才取第2点,
5.发现问题:画了后不显示,由于系统只有窗口变化才会调用OnDraw重画,添加Invalidate()函数强制重画
可以完成画一个直线,但是只能按初始值画,不能变化
作业:回去自己再加几个类,CEllipse CRectangle CTriangle
第二次课
用鼠标加菜单,实现自由画多种图形
1.加菜单响应函数,在菜单“查看—类向导”,打开类向导。
选择由View类响应WM_LBUTTONDOWN等3个函数
分析:鼠标左键落下取直线第一点,拖动找第2点,左键弹起确定第二点
7.添加菜单,添加菜单响应函数。不同的菜单,给绘不同的图赋值graphtype
8.再修改3个鼠标响应函数
void CSmallCADView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
此处是在CSmallCADDoc类中添加了一个CLine line1;类对象,在SmallCADDoc.h文件中。所以,凡是包含了#include“SmallCADDoc.h”的地方都要在前面添加#include“Line.h”语句。共3处:app doc view这3个类的cpp文件前
4.注意:初始化
void SetPoi类要作为数据成员出现在Doc类中
class CSmallCADDoc : public CDocument
{
protected: // create from serialization only
CSmallCADDoc();
DECLARE_DYNCREATE(CSmallCADDoc)
//Invalidate();
step=1;
}
作业:完成其他3种不同的图形绘制,其中三角形稍有不同,要响应3次鼠标左键落下
第3次课
由于前面只有一个图形类对象,每次画新的图就会替换掉老的图。添加链表类,实现所以的图形都能自由绘制并保存
1.添加CLineList类
class CLineList
{
CLine *head;
相关文档
最新文档