MapX的绘图刷新导致客户区cdc绘图丢失的问题。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/waterywine/article/details/2469926
      最近程序中遇到在使用mapx绘图的同时,还必须在客户区窗口中使用cdc 直接绘图。

      但是这出现了问题,就是当mapx 刷新时(比如窗口移动,最大化,遮盖),同时会将cdc 设备的绘图刷掉。

      原来一直以为可以在cview::ondraw 中重绘,但是怎么也不行。后来想到可能mapx的绘制是否在ondraw之后发生的。那么也就是说必须等到mapx的绘图之后才可以使用cdc绘图,才能保证不被刷掉。

      后来参考mapx 手册,找到了这个事件,确实很少用,但一切ok了。事件说明如下:

MapDraw 事件

此事件在绘图之前调用一次,在绘图完成之后调用一次。此处有一个参数表明绘图是开始还是结束。Dispatch ID = 15

语法MapDraw (Flag)
Flag miDrawBegin 或 miDrawEnd。
//-------------------------------------------------------
程序中:1头文件cmapview.hprotected:   

void OnMapDraw(short Flag);

2代码文件cmapview.cpp

BEGIN_EVENTSINK_MAP(WSMapView, CView)   

ON_EVENT(WSMapView,IDC_MAP,15,OnMapDraw,VTS_I2)

END_EVENTSINK_MAP()

void WSMapView::OnMapDraw(short Flag)
{
    if(Flag==1)
    {
        //TRACE("绘制前");
       return;
    }
   if(Flag==2)
    {
        //TRACE("绘制后!");
    }
}
展开阅读全文

关于使用CDC绘图刷新问题

11-23

我在单文档mfc中贴了一张很大的图,是视图区域面积的四倍。(高是视图区域高的2倍,宽是视图区域宽的2倍)rn希望能用鼠标拖动这张图,结果刷新出了问题。rnrn代码如下:rnrnvoid COneKeyReadDemoView::OnDraw(CDC* pDC)rnrn COneKeyReadDemoDoc* pDoc = GetDocument();rn ASSERT_VALID(pDoc);rn // TODO: add draw code for native data herern GetClientRect(&m_RectImage);rn CDC memDC;rn memDC.CreateCompatibleDC(pDC);rn rn CBitmap bm;rn bm.CreateCompatibleBitmap(pDC, m_RectImage.Width(), m_RectImage.Height());rn rn CBitmap * pOldBitmap = memDC.SelectObject(&bm);rn CPoint tempPoint;rn DrawPage(&memDC, tempPoint, tempPoint, tempPoint);rn pDC->BitBlt(m_SaveLT.x + m_ptMove.x - m_ptDown.x, m_SaveLT.y + m_ptMove.y - m_ptDown.y, m_RectImage.Width()*2, rn m_RectImage.Height()*2, &memDC, 0, 0, SRCCOPY);rn rn memDC.SelectObject(pOldBitmap);rn pOldBitmap->DeleteObject();rn memDC.DeleteDC();rn rn m_SaveLT.x += m_ptMove.x - m_ptDown.x;rn m_SaveLT.y += m_ptMove.y - m_ptDown.y;rn m_ptDown = m_ptMove;rnrnrn其中rnvoid COneKeyReadDemoView::DrawPage(CDC *pDC, CPoint &SavePoint, CPoint &LDownPoint, CPoint &LMovePoint)rnrn CDC memDC;rn memDC.CreateCompatibleDC(pDC);rnrn BITMAP bm;rn m_targetBmLT.GetBitmap(&bm);rn CBitmap * pOldBitmap = memDC.SelectObject(&m_targetBmLT);rn pDC->StretchBlt(0, 0, m_RectImage.Width(), m_RectImage.Height()*2, &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);rnrn memDC.SelectObject(m_targetBmRT);rn pDC->StretchBlt(m_RectImage.Width(), 0, m_RectImage.Width(), m_RectImage.Height()*2, &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);rnrn memDC.SelectObject(pOldBitmap);rn pOldBitmap->DeleteObject();rn memDC.DeleteDC(); rnrnrn不知道为什么刷新会出问题,望达人告知。rn 论坛

没有更多推荐了,返回首页