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为矩形的⾼度。

  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;
相关文档
最新文档