初学MFC,实在弄得不知所云,比如刚刚画完的直线,最大/小化就不见,不知道如何重绘。还有就是怎样利用序列化保存已经画好的图形数据,非常想各位专家或者了解这方面的人帮忙,如果可以的话,补充代码更好,谢谢你们!我做的程序(VS2005) 名称是小画板
// 小画板Doc.h : C小画板Doc 类的接口
#pragma onceclass C小画板Doc : public CDocument
{
protected: // 仅从序列化创建
C小画板Doc();
DECLARE_DYNCREATE(C小画板Doc)// 属性
public:// 操作
public:// 重写
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);// 实现
public:
virtual ~C小画板Doc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endifprotected:// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
};
// 小画板Doc.cpp : C小画板Doc 类的实现
//#include "stdafx.h"
#include "小画板.h"#include "小画板Doc.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// C小画板DocIMPLEMENT_DYNCREATE(C小画板Doc, CDocument)BEGIN_MESSAGE_MAP(C小画板Doc, CDocument)
END_MESSAGE_MAP()
// C小画板Doc 构造/析构C小画板Doc::C小画板Doc()
{
// TODO: 在此添加一次性构造代码}C小画板Doc::~C小画板Doc()
{
}BOOL C小画板Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE; // TODO: 在此添加重新初始化代码
// (SDI 文档将重用该文档) return TRUE;
}
// C小画板Doc 序列化void C小画板Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
}
}
// C小画板Doc 诊断#ifdef _DEBUG
void C小画板Doc::AssertValid() const
{
CDocument::AssertValid();
}void C小画板Doc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
视图类
// 小画板View.h : C小画板View 类的接口
//
#pragma once
#include "atltypes.h"
class C小画板View : public CView
{
protected: // 仅从序列化创建
C小画板View();
DECLARE_DYNCREATE(C小画板View)// 属性
public:
C小画板Doc* GetDocument() const;// 操作
public:// 重写
public:
virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);// 实现
public:
virtual ~C小画板View();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endifprotected:// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnDrawLine();
public:
afx_msg void OnDrawRectangle();
public:
afx_msg void OnDrawEllipse();public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
public:
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
public:
// 当前鼠标坐标
CPoint m_begin;
public:
// 图形形状
int m_iType;
public:
afx_msg void OnLineSetting();
public:
int lineWidth;  //定义线宽
public:
// 线形设置
int lineStyle;
public:
afx_msg void OnColorSetting();
public:
// 颜色设置
COLORREF color;
public:
afx_msg void OnDrawBrush();
public:
// 填充颜色
COLORREF BrushColor;
};#ifndef _DEBUG  // 小画板View.cpp 中的调试版本
inline C小画板Doc* C小画板View::GetDocument() const
   { return reinterpret_cast<C小画板Doc*>(m_pDocument); }
#endif
// 小画板View.cpp : C小画板View 类的实现
#include "stdafx.h"
#include "小画板.h"#include "小画板Doc.h"
#include "小画板View.h"
#include "LINESETTING.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// C小画板ViewIMPLEMENT_DYNCREATE(C小画板View, CView)BEGIN_MESSAGE_MAP(C小画板View, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_COMMAND(ID_DRAW_LINE, &C小画板View::OnDrawLine)
ON_COMMAND(ID_DRAW_RECTANGLE, &C小画板View::OnDrawRectangle)
ON_COMMAND(ID_DRAW_ELLIPSE, &C小画板View::OnDrawEllipse)

ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_LINE_SETTING, &C小画板View::OnLineSetting)
ON_COMMAND(ID_COLOR_SETTING, &C小画板View::OnColorSetting)
ON_COMMAND(ID_DRAW_BRUSH, &C小画板View::OnDrawBrush)
END_MESSAGE_MAP()// C小画板View 构造/析构C小画板View::C小画板View()
: m_begin(0)
, m_iType(0)       
, lineWidth(0)
, lineStyle(0)
, color(RGB(0,255,0))  //初始化缺省颜色为绿色
, BrushColor(RGB(0,0,0))
{
// TODO: 在此处添加构造代码}C小画板View::~C小画板View()
{
}BOOL C小画板View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
//  CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs);
}// C小画板View 绘制void C小画板View::OnDraw(CDC* /*pDC*/)
{
C小画板Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return; // TODO: 在此处为本机数据添加绘制代码
}
// C小画板View 打印BOOL C小画板View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}void C小画板View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}void C小画板View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清除过程
}
// C小画板View 诊断#ifdef _DEBUG
void C小画板View::AssertValid() const
{
CView::AssertValid();
}void C小画板View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}C小画板Doc* C小画板View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C小画板Doc)));
return (C小画板Doc*)m_pDocument;
}
#endif //_DEBUG
// C小画板View 消息处理程序void C小画板View::OnDrawLine()
{
// TODO: 在此添加命令处理程序代码
m_iType=1;
}void C小画板View::OnDrawRectangle()
{
// TODO: 在此添加命令处理程序代码
m_iType=2;
}void C小画板View::OnDrawEllipse()
{
// TODO: 在此添加命令处理程序代码
m_iType=3;
}void C小画板View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
this->m_begin=point;
CView::OnLButtonDown(nFlags, point);
}void C小画板View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);//定义新画笔
CPen pen(lineStyle,lineWidth,color);
dc.SelectObject(&pen);//颜色填充
CBrush brush(BrushColor);
dc.SelectObject(brush);////去除覆盖,画刷透明化
//CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//dc.SelectObject(pBrush);if(m_iType==1)
{
dc.MoveTo(m_begin);
dc.LineTo(point);
}
if(m_iType==2)
{
dc.Rectangle(m_begin.x,m_begin.y,point.x,point.y);
}
if(m_iType==3)
{
dc.Ellipse(m_begin.x,m_begin.y,point.x,point.y);
}
//删除新笔
pen.DeleteObject();
//删除画刷
brush.DeleteObject();
CView::OnLButtonUp(nFlags, point);
}void C小画板View::OnLineSetting()
{
// TODO: 在此添加命令处理程序代码
CLINESETTING  dlg;    dlg.m_lineWidth=this->lineWidth;  //保存用户设置
dlg.m_lineStyle=this->lineStyle; if(dlg.DoModal()==IDOK) //如果用户选择的是确定按纽
{
this->lineWidth=dlg.m_lineWidth; //设置线宽
this->lineStyle=dlg.m_lineStyle; //设置线形 }
}void C小画板View::OnColorSetting()
{
// TODO: 在此添加命令处理程序代码
CColorDialog dlg; 
dlg.m_cc.Flags |= CC_RGBINIT;    //设置颜色对话框初始选择的颜色
    dlg.m_cc.rgbResult=this->color;  //保存用户设置
if(dlg.DoModal()==IDOK)   //如果用户选择的是确定按纽
{
this->color=dlg.m_cc.rgbResult;   //设置颜色
}
}void C小画板View::OnDrawBrush()
{
// TODO: 在此添加命令处理程序代码
CColorDialog dlg; 
dlg.m_cc.Flags |= CC_RGBINIT;    //设置颜色对话框初始选择的颜色
    dlg.m_cc.rgbResult=this->BrushColor;  //保存用户设置
if(dlg.DoModal()==IDOK)   //如果用户选择的是确定按纽
{
this->BrushColor=dlg.m_cc.rgbResult;   //设置颜色
}
}
线条设置类#pragma once
#include "afxwin.h"
// CLINESETTING 对话框class CLINESETTING : public CDialog
{
DECLARE_DYNAMIC(CLINESETTING)public:
CLINESETTING(CWnd* pParent = NULL);   // 标准构造函数
virtual ~CLINESETTING();// 对话框数据
enum { IDD = IDD_DIALOG_SETLINE };protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持 DECLARE_MESSAGE_MAP()

public:
// 线宽设置
int m_lineWidth;
public:
// 线形设置
int m_lineStyle;
};