1、为了便于管理,创建一个新类用于执行绘图的相关操作,另外用list容器保存每次的绘图信息,最后添加一个保存和读取文件的内容。

头文件:

#pragma once      


       class CGraph      


       {      


       public:      


              CGraph(void);      


              CGraph(int nType, POINT ptBegin, POINT ptEnd);      


              ~CGraph(void);      


              


              int m_nType;             // 绘图类型      


              POINT m_ptBegin;         // 起始点      


              POINT m_ptEnd;           // 终止点      


              


              // 绘图      


              int DrawGraph(HDC hdc);      


              


       };


CPP文件(重载了类的构造函数):

#include "StdAfx.h"      


       #include "Graph.h"      


              


       CGraph::CGraph(void)      


       {      


              


       }      


              


       CGraph::CGraph(int nType, POINT ptBegin, POINT ptEnd)      


              :m_nType(nType)      


              ,m_ptBegin(ptBegin)      


              ,m_ptEnd(ptEnd)      


       {      


       }      


              


              


       CGraph::~CGraph(void)      


       {      


       }      


              


       int CGraph::DrawGraph(HDC hdc)      


       {      


              switch        (m_nType)      


              {      


              case        TYPE_LINE:      


              MoveToEx(hdc, m_ptBegin.x, m_ptBegin.y, NULL);      


              LineTo(hdc, m_ptEnd.x, m_ptEnd.y);      


              break       ;      


              case        TYPE_RECT:      


              Rectangle(hdc, m_ptBegin.x, m_ptBegin.y, m_ptEnd.x, m_ptEnd.y);      


              break       ;      


              case        TYPE_ELLIPSE:      


              Ellipse(hdc, m_ptBegin.x, m_ptBegin.y, m_ptEnd.x, m_ptEnd.y);      


              break       ;      


              default       :      


              break       ;      


              }      


              return        0;      


       }


另外,还定义了一个绘图类型的枚举:

// 绘图类型      


       enum      


       {      


              TYPE_LINE,      


              TYPE_RECT,      


              TYPE_ELLIPSE      


       };



2、首先实现list容器保存绘图信息的功能:

#include <list>      


       using namespace std;


list <CGraph*> g_data;      


       list <CGraph*>::iterator it;         // 迭代器
//      


       //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)      


       //      


       //  目的: 处理主窗口的消息。      


       //      


       //  WM_COMMAND    - 处理应用程序菜单      


       //  WM_PAINT  - 绘制主窗口      


       //  WM_DESTROY    - 发送退出消息并返回      


       //      


       //      


       LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)      


       {      


              int wmId, wmEvent;      


              PAINTSTRUCT ps;      


              HDC hdc;      


              static POINT ptBegin;        


              static POINT ptEnd;      


              static int nType = TYPE_LINE;      


              CGraph *pGraph = NULL;      


              


              switch        (message)      


              {      


              case        WM_LBUTTONDOWN:      


              ptBegin.x = LOWORD(lParam);      


              ptBegin.y = HIWORD(lParam);      


              break       ;      


              case        WM_LBUTTONUP:      


              ptEnd.x = LOWORD(lParam);      


              ptEnd.y = HIWORD(lParam);      


              


              pGraph =        new        CGraph(nType, ptBegin, ptEnd);      


              if        (pGraph != NULL)      


              {      


              g_data.push_back(pGraph);      


              }      


              


              InvalidateRect(hWnd, NULL,        true       );      


              break       ;      


              


              case        WM_PAINT:      


              hdc = BeginPaint(hWnd, &ps);      


              // TODO: 在此添加任意绘图代码...      


              


              pGraph = NULL;      


              for        (it = g_data.begin(); it != g_data.end(); it++)      


              {      


              pGraph = *it;      


              if        (pGraph != NULL)      


              {      


              pGraph->DrawGraph(hdc);      


              }      


              }      


              


              EndPaint(hWnd, &ps);      


              break       ;      


              


              省略……      


       }



3、接着,添加文件操作,将list中的数据保存到一个txt文本文件中:

(1)定义两个函数,分别用于保存和读取数据:

BOOL SaveDrawInfo();         // 保存绘图信息      


       BOOL OpenDrawInfo();         // 读取绘图信息


(2)函数实现:

BOOL SaveDrawInfo()      


       {      


              ofstream ofs;      


              ofs.open(       "