第十三课:重绘 一、基本知识: 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);

评论