在使用类CMetaFileDC时发现,将滚动条拉到下面时再画线,然后重绘后,发现线条在原来位置的上方出现。后来又添加代码:
this->OnPrepareDC(&dc);
dc.DPtoLP(&point1);
dc.DPtoLP(&point2);
比如dc为CMetaFileDC的类对象,point1和point2为线条的起点和终点。此时会出现非法操作!
请问这个问题怎么解决啊,最好是把编程思想和代码都贴上去,先谢谢大家了!

解决方案 »

  1.   

    这样操作,就会解决图形错位的问题:
    void CCGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CClientDC dc(this);
    m_MetaFileDc.SelectStockObject(NULL_BRUSH);
    dc.SelectStockObject(NULL_BRUSH);
    CPen pen(m_LineStyle,m_LineWidth,m_color);
    m_MetaFileDc.SelectObject(&pen);
    dc.SelectObject(&pen); OnPrepareDC(&dc);
    dc.DPtoLP(&m_point);
    dc.DPtoLP(&point); switch (m_number)
    {
    case 1:
    dc.SetPixel(m_point,m_color);
    m_MetaFileDc.SetPixel(m_point,m_color);
    break;
    case 2:
    dc.MoveTo(m_point);
    dc.LineTo(point);
    m_MetaFileDc.MoveTo(m_point);
    m_MetaFileDc.LineTo(point);
    break;
    case 3:
    dc.Rectangle(m_point.x,m_point.y,point.x,point.y);
    m_MetaFileDc.Rectangle(m_point.x,m_point.y,point.x,point.y);
    break;
    case 4:
    dc.Ellipse(m_point.x,m_point.y,point.x,point.y);
    m_MetaFileDc.Ellipse(m_point.x,m_point.y,point.x,point.y);
    break;
    default:break;
    }
    CScrollView::OnLButtonUp(nFlags, point);
    }
    说明:m_MetaFileDc是CMeatFileDC的对象。思路是:先调用CDC::DPtoLP将设备坐标转化为逻辑坐标,再在OnDraw()函数中调用CMeatFileDC的成员函数绘图,就会解决上述问题。为什么调用CMeatFileDC::DPtoLP()函数不能直接实现转化,还请各位指教,我认为问题出在了OnPrepare()中了。
      

  2.   

    问题追加,CMetaFileDC只能保存一次
    ?????????????????????
    我现在都认命了,也许真的没有解决办法,也许CMetaFileDC真好有这个缺陷