绘制图片时使用双缓冲机制,避免闪烁

CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
    BOOL bPrinting = pDC->IsPrinting();
    float zoom=pDoc->GetZoomFactor();

    CPoint scrollPoint = GetScrollPosition();
    m_isScroll =FALSE;
    if (scrollPoint.x!=m_lastScroll.x || scrollPoint.y!=m_lastScroll.y)
    {
        m_isScroll = TRUE;
    }

    CRect rcClient;
    GetClientRect(&rcClient);
    if (m_sizeChange || m_isScroll || m_isDraw || pDoc->m_isZoomed)
    {
        if(pDoc->BlockHandle(scrollPoint,rcClient,zoom)==FALSE)
        {
            return;
        }

        pDoc->m_isZoomed = FALSE;
        m_isDraw =FALSE;
        m_sizeChange = FALSE;
        m_lastScroll = scrollPoint;
    }
    int nWidth,nHeight;
    nWidth = pDoc->m_pBitmapInfo->bmiHeader.biWidth;
    nHeight = pDoc->m_pBitmapInfo->bmiHeader.biHeight;

    CDC MemDC;                        //首先定义一个显示设备对象
    CBitmap MemBitmap,*pOldBitmap;    //定义一个位图对象

    //建立与屏幕显示兼容的内存显示设备
    MemDC.CreateCompatibleDC(pDC);
    //创建一与pDC兼容的位图,大小为整个客户区
    MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
    //将位图选入内存环境
    pOldBitmap=MemDC.SelectObject(&MemBitmap);

    //先用背景色将位图清除干净
    MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

    //使DC的整个客户区都成无效区
    MemDC.SelectClipRgn(NULL);

    //再“与上”检取的无效区,使内存环境与pDC检取的无效区相等
    MemDC.IntersectClipRect(rcClient);

    SetStretchBltMode(MemDC.m_hDC,BLACKONWHITE|WHITEONBLACK);

    if (!bPrinting && m_brHatch.m_hObject){
        rcClient.right  = max(rcClient.right , m_totalDev.cx);
        rcClient.bottom = max(rcClient.bottom, m_totalDev.cy);
        m_brHatch.UnrealizeObject();
        CPoint pt(0, 0);
        MemDC.LPtoDP(&pt);
        pt = MemDC.SetBrushOrg(pt.x % 8, pt.y % 8);
    //    CBrush* old = MemDC.SelectObject(&m_brHatch);
        m_brHatch.CreateStockObject(NULL_BRUSH);
        CBrush* old = (CBrush*)MemDC.SelectObject(&m_brHatch);
        MemDC.FillRect(&rcClient, &m_brHatch);
        MemDC.SelectObject(old);
    }

    if (pDoc->m_poDataset) {
        if (pDoc->m_tool==ID_Tfw_bGcpNew) {
            for (int i=0;ivTfwGcps.size();i++) {
                CMyDoc::GcpImxyGcpXY&gcp=pDoc->vTfwGcps[i];
                CPoint point=toGui(gcp.X,gcp.Y);
                pDC->MoveTo(point.x-2,point.y  ); pDC->LineTo(point.x+2,point.y );
                pDC->MoveTo(point.x  ,point.y-2); pDC->LineTo(point.x ,point.y+2);
            }
        }      

        if (!bPrinting) {
            StretchDIBits(MemDC.m_hDC,0,0,nWidth,nHeight,0,0,nWidth,nHeight,pDoc->m_pDataBasic,
                    pDoc->m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
             pDC->BitBlt(scrollPoint.x,scrollPoint.y,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

            MemDC.SelectObject(pOldBitmap);
            MemBitmap.DeleteObject();
            MemDC.DeleteDC();

            if ( m_tracker.m_rect.Width()>0 && m_tracker.m_rect.Height()>0 )
                m_tracker.Draw(pDC);

        }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值