正文

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

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

分享到:

第十三课:重绘

一、基本知识:

1.  OnPaintOnDraw函数

View的父类的OnPaint函数调用了OnDraw函数,若在子类为WM_PAINT消息添加响应函数OnPaintOnDraw函数将不会被调用。

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.  加入滚动条:将Viewcpp文件和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.  ViewOnCreate中加入代码:

m_dcMetaFile.Create();

3.  ViewOnLButtonUp中,注释有关数组的代码,加入:

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);


阅读(4325) | 评论(0)


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

评论

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