第十三课:重绘
一、基本知识:
1. OnPaint和OnDraw函数
View的父类的OnPaint函数调用了OnDraw函数,若在子类为WM_PAINT消息添加响应函数OnPaint,OnDraw函数将不会被调用。
2. CpaintDC和
CpaintDC的构造函数中调用了BeginPaint(),析构函数中调用了EndPaint();
CclietnDC的构造函数中调用了GetDC(),析构函数中调用了ReleaseDC()。
而BeginPaint(),EndPaint()只能用于响应WM-PAINT消息,否则将会出错。
二、利用动态数组:
1. 定义结构体LINE,用于保存线的数据。
struct LINE
{
CPoint m_pt1;
CPoint m_pt2;
};
2. 在View中定义一个动态数组,保存每一根线的指针。
CPtrArray m_ptrLines;
定义两个Cpoint的成员变量,保存线的起点和终点:
CPoint m_ptOld;
CPoint m_ptNew;
3. 在View中加入WM_LBUTTONDOWN,WM_LBUTTONUP的响应函数,在OnLButtonDown中为m_ptNew赋值,
m_ptOld=point;
4. 在OnLButtonUp中加入代码:
m_ptNew=point;
CClientDC dc(this);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
LINE *pLn=new LINE;
pLn->m_pt1=m_ptOld;
pLn->m_pt2=m_ptNew;
m_ptrLines.Add(pLn);
5. 在OnDraw()中加入:
int sum= m_ptrLines.GetSize();
for(int i=0;i<sum;i++)
{
pDC->MoveTo(((Line *)m_ptrLines.GetAt(i))->m_pt1);
pDC->LineTo(((Line *)m_ptrLines.GetAt(i))->m_pt2);
}
6. 加入滚动条:将View的cpp文件和h文件中的CView全部替换成CScrollView。
7. 在view中加入虚函数OnInitialUpdate(),这个函数在View第一次刷新前被调用,在其中加入代码:
SetScrollSizes(MM_TEXT,CSize(1024,768));
这个函数也可在View的构造函数中调用。
8. 在OnLButtonUp中生成DC后加入
OnPrepareDC(&dc);
dc.DPtoLP(&m_ptOld);
dc.DPtoLP(&m_ptNew);
三、利用CmetaFileDC重绘
1. 在View中定义成员变量:
CMetaFileDC m_dcMetaFile;
2. 在View的OnCreate中加入代码:
m_dcMetaFile.Create();
3. 在View的OnLButtonUp中,注释有关数组的代码,加入:
m_dcMetaFile.MoveTo(m_ptOld);
m_dcMetaFile.LineTo(m_ptNew);
4. 在OnDraw()中
HMETAFILE hmetafile;
hmetafile=m_dcMetaFile.Close();
pDC->PlayMetaFile(hmetafile);
m_dcMetaFile.Create();
m_dcMetaFile.PlayMetaFile(hmetafile);
::DeleteMetaFile(hmetafile);
5. 保存文件:
加入菜单响应函数,OnFileSave,加入代码:
HMETAFILE hmetafile;
hmetafile=m_dcMetaFile.Close();
::CopyMetaFile(hmetafile,"c:\\2.ddd");
m_dcMetaFile.Create();
m_dcMetaFile.PlayMetaFile(hmetafile);
::DeleteMetaFile(hmetafile);
6. 读出文件:
加入菜单响应函数,OnFileLoad,加入代码:
HMETAFILE hmetafile;
hmetafile=::GetMetaFile("c:\\2.ddd");
m_dcMetaFile.PlayMetaFile(hmetafile);
::DeleteMetaFile(hmetafile);
Invalidate();
四、利用兼容DC重绘:
1. 在View中定义成员变量:
CDC m_dcCompa;
2. 在OnLButtonDown中加入代码:
CClientDC dc(this);
if(!m_dcCompa.m_hDC)
{
m_dcCompa.CreateCompatibleDC(&dc);
CBitmap bmp;
CRect rect;
GetClientRect(&rect);
bmp.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
m_dcCompa.SelectObject(&bmp);
m_dcCompa.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
}
m_dcCompa.MoveTo(m_ptOld);
m_dcCompa.LineTo(m_ptNew);
3. 在OnDraw中加入:
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcCompa,0,0,SRCCOPY);
评论