正文

第十三课:重绘2007-09-25 15:47:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lym51/29658.html

分享到:

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

阅读(4618) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册