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