mfc绘图程序上机步骤
原来所有对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;