用VS2012的MFC做一個可以畫直線、矩形、橢圓的畫圖軟體后,用滑鼠改變對話框的大小后之前畫的圖形就消失了,怎么用鏈表實作保存功能???急急急
uj5u.com熱心網友回復:
我的主要代碼如下:::// 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);
}
uj5u.com熱心網友回復:
鏈表在記憶體中next的值是記憶體地址鏈表在檔案中next的值是檔案偏移量
uj5u.com熱心網友回復:
1、畫圖操作,滑鼠的動作等必須使用合適的資料結構保存資料,而不是直接畫到螢屏一般OnLButtonDown之類的動作函式里,不包含GDI繪圖函式
2、在操作完畢后呼叫Invalidate
3、由OnDraw負責根據1的資料或者從磁盤加載的資料繪畫
uj5u.com熱心網友回復:
是的,畫圖我用的OnLButtonDown之類的動作函式,就卡在這個保存上了,感謝你的指點uj5u.com熱心網友回復:
在 OnLButtonUp(nFlags, point);中改變 m_DrawType, 然后 Invalidate (系統呼叫 OnDraw),把 switch 代碼 放OnDraw 中
uj5u.com熱心網友回復:
可以構造一個基礎類, 用于存放圖形的型別、坐標、尺寸、顏色等屬性,滑鼠操作的時候構造和記錄這些屬性,添加到鏈表中, WM_PAINT中繪制鏈表uj5u.com熱心網友回復:
你要用不同的類來保存你畫的圖形啊,比如說CLine CCircle CPolyline....這些都是要保存在程式中的,重繪時再根據保存的這些資料畫出來uj5u.com熱心網友回復:
Metafile GDI Sampleuj5u.com熱心網友回復:
MetafilesA 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.
uj5u.com熱心網友回復:
list<struct a> mm;
uj5u.com熱心網友回復:
孫鑫的MFC視頻有這個功能的全部代碼以及功能講解,看下就明白了轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/59534.html
標籤:界面
