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);
}
绘制图片时使用双缓冲机制,避免闪烁
最新推荐文章于 2022-06-12 22:38:36 发布