问题描述
- mfc中如何解决屏幕闪烁
-
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data hereCRect rect; GetClientRect(&rect);//获取客户区大小 //画背景 棋盘等 static bool i=0; if(!i) { bmpbegin.LoadBitmap(IDB_BEGIN); begindc.CreateCompatibleDC(pDC); begindc.SelectObject(&bmpbegin); bmpend.LoadBitmap(IDB_END); enddc.CreateCompatibleDC(pDC); enddc.SelectObject(&bmpend); bmpback.LoadBitmap(IDB_BACK); backdc.CreateCompatibleDC(pDC); backdc.SelectObject(&bmpback); bmpback.GetBitmap(&backbmp); i=1; } pDC>StretchBlt(20,20,rect.Width()-130,rect.Height()-30,&backdc,0,0,backbmp.bmWidth,backbmp.bmHeight,SRCCOPY); pDC->BitBlt(rect.Width()-100,70,100,50,&begindc,0,0,SRCCOPY); pDC->BitBlt(rect.Width()-100,150,100,50,&enddc,0,0,SRCCOPY); //棋盘坐标赋值 /*************************************************************************/ float mapw,maph;//格子长度 mapw =((float)rect.Width()-130.0)/14.0; maph =((float)rect.Height()-30.0)/14.0; int mapi,mapj; for(mapi=0;mapi<15;mapi++) { for(mapj=0;mapj<15;mapj++) { (mappoint[mapi][mapj]).x=20+mapi*mapw; (mappoint[mapi][mapj]).y=20+mapj*maph; } } /*************************************************************************/ //画棋子 CBrush backbrush(RGB(0,0,0)); CBrush whitebrush(RGB(255,255,255)); for(mapi=0;mapi<15;mapi++) { for(mapj=0;mapj<15;mapj++) { if(backmap[mapi][mapj]||whitemap[mapi][mapj]) { CPoint p1,p2; p1.x=mappoint[mapi][mapj].x-maph/2; p1.y=mappoint[mapi][mapj].y-maph/2; p2.x=mappoint[mapi][mapj].x+maph/2; p2.y=mappoint[mapi][mapj].y+maph/2; if(backmap[mapi][mapj]) pDC->SelectObject(backbrush); if(whitemap[mapi][mapj]) pDC->SelectObject(whitebrush); pDC->Ellipse(CRect(p1,p2)); } } } if(1==chess%2) str="白棋走"; if(0==chess%2) str="黑棋走"; pDC->TextOut(rect.Width()-80,20,str); str.Format("棋子数:%d",chess-1); pDC->TextOut(rect.Width()-80,40,str);
}
解决方案
解决屏幕闪烁问题,要用双缓冲技术,强调一下gdi+不支持双缓冲,gdi才支持。就是先再内存中画,然后再一次性画到屏幕上面,这样就避免屏幕设备不断出现白色屏幕的闪烁问题。
时间: 2025-01-18 10:53:26