VS2012用MFC做画图软件后怎么用链表保存,望指点????

537483687468 2018-11-20 11:31:56
用VS2012的MFC做一个可以画直线、矩形、椭圆的画图软件后,用鼠标改变对话框的大小后之前画的图形就消失了,怎么用链表实现保存功能???急急急
...全文
172 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sichuanwww 2018-11-22
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903 的回复:
可以构造一个基础类, 用于存放图形的类型、坐标、尺寸、颜色等属性,鼠标操作的时候构造和记录这些属性,添加到链表中, WM_PAINT中绘制链表

list<struct a> mm;
待续_1006 2018-11-22
  • 打赏
  • 举报
回复
孙鑫的MFC视频有这个功能的全部代码以及功能讲解,看下就明白了
赵4老师 2018-11-21
  • 打赏
  • 举报
回复
Metafiles
A metafile is a collection of structures that store a picture in a device-independent format. Device independence is the one feature that sets metafiles apart from bitmaps. Unlike a bitmap, a metafile guarantees device independence. There is a drawback to metafiles, however; they are generally drawn more slowly than bitmaps. Therefore, if an application requires fast drawing and device independence is not an issue, it should use bitmaps instead of metafiles.

For information about bitmaps, see Bitmaps.


赵4老师 2018-11-21
  • 打赏
  • 举报
回复
Metafile GDI Sample
ForgetTomorrow 2018-11-21
  • 打赏
  • 举报
回复
你要用不同的类来保存你画的图形啊,比如说CLine CCircle CPolyline....这些都是要保存在程序中的,重绘时再根据保存的这些数据画出来
zgl7903 2018-11-21
  • 打赏
  • 举报
回复
可以构造一个基础类, 用于存放图形的类型、坐标、尺寸、颜色等属性,鼠标操作的时候构造和记录这些属性,添加到链表中, WM_PAINT中绘制链表

schlafenhamster 2018-11-21
  • 打赏
  • 举报
回复
在 OnLButtonUp(nFlags, point);中改变 m_DrawType, 然后 Invalidate (系统调用 OnDraw),把 switch 代码 放
OnDraw 中
537483687468 2018-11-20
  • 打赏
  • 举报
回复
我的主要代码如下:::



// MFCApplication2View.cpp : CMFCApplication2View 类的实现
//

#include "stdafx.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "MFCApplication2.h"
#endif

#include "MFCApplication2Doc.h"
#include "MFCApplication2View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

int m_DrawType;
CPoint m_End;
CPoint m_ptOrigin;

// CMFCApplication2View

IMPLEMENT_DYNCREATE(CMFCApplication2View, CView)

BEGIN_MESSAGE_MAP(CMFCApplication2View, 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_32771, &CMFCApplication2View::OnLine)
ON_COMMAND(ID_32772, &CMFCApplication2View::OnRectangle)
ON_COMMAND(ID_32773, &CMFCApplication2View::OnEllipse)
ON_COMMAND(ID_32774, &CMFCApplication2View::OnColor)
ON_COMMAND(ID_32775, &CMFCApplication2View::OnSetting)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

// CMFCApplication2View 构造/析构

CMFCApplication2View::CMFCApplication2View()
{
// TODO: 在此处添加构造代码
}

CMFCApplication2View::~CMFCApplication2View()
{
}

BOOL CMFCApplication2View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式

return CView::PreCreateWindow(cs);
}

// CMFCApplication2View 绘制

void CMFCApplication2View::OnDraw(CDC* /*pDC*/)
{
CMFCApplication2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码
}


// CMFCApplication2View 打印

BOOL CMFCApplication2View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}

void CMFCApplication2View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}

void CMFCApplication2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}


// CMFCApplication2View 诊断

#ifdef _DEBUG
void CMFCApplication2View::AssertValid() const
{
CView::AssertValid();
}

void CMFCApplication2View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CMFCApplication2Doc* CMFCApplication2View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication2Doc)));
return (CMFCApplication2Doc*)m_pDocument;
}
#endif //_DEBUG


// CMFCApplication2View 消息处理程序


void CMFCApplication2View::OnLine()
{
// TODO: 在此添加命令处理程序代码
m_DrawType=1;
}


void CMFCApplication2View::OnRectangle()
{
// TODO: 在此添加命令处理程序代码
m_DrawType=2;
}


void CMFCApplication2View::OnEllipse()
{
// TODO: 在此添加命令处理程序代码
m_DrawType=3;
}


void CMFCApplication2View::OnColor()
{
// TODO: 在此添加命令处理程序代码
}


void CMFCApplication2View::OnSetting()
{
// TODO: 在此添加命令处理程序代码
}


void CMFCApplication2View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_ptOrigin=point;
CView::OnLButtonDown(nFlags, point);
}


void CMFCApplication2View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CClientDC dc(this); //创建dc
CPen pen(PS_SOLID,1,RGB(255,0,0)); //创建绘制的画笔
CBrush *pbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //创建绘制时填充的画刷
dc.SelectObject(&pen); //将画刷和画笔选入设备描述表中
dc.SelectObject(pbrush);
switch (m_DrawType) //根据绘制种类进行绘制
{
case 1:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 2:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 3:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
default:
break;
}

CView::OnLButtonUp(nFlags, point);
}
537483687468 2018-11-20
  • 打赏
  • 举报
回复
是的,画图我用的OnLButtonDown之类的动作函数,就卡在这个保存上了,感谢你的指点
worldy 2018-11-20
  • 打赏
  • 举报
回复
1、画图操作,鼠标的动作等必须使用合适的数据结构保存数据,而不是直接画到屏幕
一般OnLButtonDown之类的动作函数里,不包含GDI绘图函数
2、在操作完毕后调用Invalidate
3、由OnDraw负责根据1的数据或者从磁盘加载的数据绘画

赵4老师 2018-11-20
  • 打赏
  • 举报
回复
链表在内存中next的值是内存地址
链表在文件中next的值是文件偏移量

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧