var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年08月01日

    图形的保存和重绘

    分类:

    1.     新建一个类保存图形的起点、终点、绘制类型、绘制颜色等等。或者使该类可串行化:从CObject派生,重写成员函数Serialize,使用宏DECLARE_SERIAL,定义该类不带参数的构造函数,在该类实现中使用宏IMPLEMENT_SERIAL。

    在该类头文件中定义:

    CPoint m_ptOrigin;    //起点

    CPoint m_ptEnd;        //终点

    UINT m_nDrawType;  //绘制类型

    COLORREF m_clr;      //绘制颜色

    在该类构造函数中初始化:

    m_nDrawType(0)

    , m_ptOrigin(0)

    , m_ptEnd(0)

    , m_clr(RGB(255,255,0))

     

    再在该类实现一个带参数的构造函数:

    CGraph:CGraph(m_ptOrigin, m_ptEnd, m_nDrawType, m_clr)

    {

          this-> m_ptOrigin= m_ptOrigin;

          this-> m_ptEnd= m_ptEnd;

          this-> m_nDrawType= m_nDrawType;

          this-> m_clr= m_clr;

    }

     

    在需要保存图像操作的类中加入该类头文件,并使用CPtrArray来保存该类对象指针,并在方法OnDraw()中重绘,CPtrArray返回void类型指针:

    CPtrArray m_ptrArray;

    m_ptrArray.Add(该对象指针)m_ptrArray.GetSize()得到数组大小,m_ptrArray.GetAt(…)返回索引元素值。使用时需要用该类指针强转化。

     

    MFC菜单命令更新,在头文件中有类似定义:

    afx_msg void OnLine();

    afx_msg void OnUpdateLine(CCmdUI *pCmdUI);

    CPP文件中实现消息映射:

    BEGIN_MESSAGE_MAP(CGraphicView, CScrollView)

            ON_COMMAND(IDM_LINE, &CGraphicView::OnLine)

            ON_UPDATE_COMMAND_UI(IDM_LINE, &CGraphicView::OnUpdateLine)

    END_MESSAGE_MAP()

    每当菜单被拉下尚未显示之前,其命令项(及其对应工具栏按钮)都会收到UPDATE_COMMAND_UI消息。

    也正因为如此,只要菜单被拉下一次,上述的CGraphicView::OnUpdateLine都会执行一次。于是,当你想每点击菜单项一次,它的选中状态改变一次,就需要定义一个BOOL变量:

    BOOL m_press;

    在菜单命令响应函数中改变它的值,在菜单命令更新函数中依据它的值判断:

    void CGraphicView::OnLine()

    {

          // TODO: Add your command handler code here

          m_press=TRUE;

        // UINT m_CheckFlag;

          if (m_CheckFlag%2==0)

          {

               m_nDrawType=2;

          }

          else

               m_nDrawType=0;

    }

     

    void CGraphicView::OnUpdateLine(CCmdUI *pCmdUI)

    {

          // TODO: Add your command update UI handler code here

          if (m_press)

          {

          if (m_CheckFlag%2==0)

          {

               pCmdUI->SetCheck(m_nDrawType==2);

          }

          else

               pCmdUI->SetCheck(0);

          m_CheckFlag+=1;

          m_press=FALSE;

          }

    }

     

    2.     元文件。

    利用元文件设备上下文类:CMetaFileDC,构造一个元文件DC对象,调用该类的成员函数CMetaFileDC::Create创建一个Windows元文件设备上下文;给已创建的元文件DC对象发送一系列GDI命令;调用成员函数CMetaFileDC::Close关闭元文件设备上下文并返回一个Windows元文件句柄;传递已得到的Windows元文件句柄给函数CDC::PlayMetaFile播放该元文件;调用DeleteMetaFile将该元文件(句柄)删除。

    3.     兼容设备描述表。

    利用兼容DC在内存中保存图形,在OnDraw函数中把该图形复制至目的窗口中。

     

    如果在绘制图形时想实时见到图形,这时应该在OnLButtonUp函数中进行两次绘制函数的调用:一次是用方法1或者方法2或者方法3,另一次是利用当前窗口DC调用图形绘制函数在窗口上绘制图形。这样绘制的图形不仅显示在当前窗口中,同时也被保存起来了。

    分享到:

    历史上的今天:

    JProbe 下载 2007年08月01日