您的位置:首页 > 编程语言 > C语言/C++

MFC双缓冲显示位图

2014-06-04 19:16 411 查看
void CGraphicView::OnDraw(CDC* pDC)
{
CGraphicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: add draw code for native data here
CFont *oldFont = pDC->SelectObject(&m_font);
pDC->TextOutW(0, 0, m_strFontName);
pDC->SelectObject(oldFont);

//显示位图代码;放到此处是在响应WM_DRAW消息时显示位图,当窗口改变时,程序需要先擦出背景,再显示位图;
//与在响应WM_ERASEBKGND消息(擦出背景)时直接显示位图相比,时间要长,故出现闪屏效果更明显
//但WM_ERASEBKGND消息响应函数擦除背景时好像擦除不干净,可以将显示位图位置不占据整个view区尝试一下
/*
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_TEMPER);
BITMAP btm;
bitmap.GetBitmap(&btm);
CRect rect;
GetClientRect(&rect);

CDC dcCpt;
dcCpt.CreateCompatibleDC(pDC);

dcCpt.SelectObject(&bitmap);

//pDC->BitBlt(100, 50, 600, 400, &dcCpt, 0, 0, SRCCOPY);
pDC->StretchBlt(100, 50, rect.Width(), rect.Height(), &dcCpt, 0, 0, btm.bmWidth, btm.bmHeight, SRCCOPY);
*/

//双缓冲显示位图
CBitmap oldBitmap;
oldBitmap.LoadBitmapW(IDB_TEMPER);
BITMAP btm;
oldBitmap.GetBitmap(&btm);

CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);		//创建兼容DC
dcCompatible.SelectObject(&oldBitmap);		//位图选入兼容DC

CDC bkDC;
bkDC.CreateCompatibleDC(pDC);		   //创建包含兼容位图的兼容DC
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, btm.bmWidth, btm.bmHeight);   //创建兼容位图
bkDC.SelectObject(bitmap);

bkDC.BitBlt(0,0,btm.bmWidth,btm.bmHeight, &dcCompatible, 0, 0, SRCCOPY);

pDC->BitBlt(0,0,btm.bmWidth,btm.bmHeight, &bkDC, 0, 0, SRCCOPY);

oldBitmap.DeleteObject();
bitmap.DeleteObject();
bkDC.DeleteDC();
dcCompatible.DeleteDC();
}
BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default

/*
//显示位图4步骤
CBitmap bitmap;
bitmap.LoadBitmapW(IDB_TEMPER);
BITMAP btm;
bitmap.GetBitmap(&btm);
CRect rect;
GetClientRect(&rect);

CDC dcCpt;
dcCpt.CreateCompatibleDC(pDC);

dcCpt.SelectObject(&bitmap);

//pDC->BitBlt(100, 50, 600, 400, &dcCpt, 0, 0, SRCCOPY);
pDC->StretchBlt(100, 50, rect.Width(), rect.Height(), &dcCpt, 0, 0, btm.bmWidth, btm.bmHeight, SRCCOPY);

bitmap.DeleteObject();
dcCpt.DeleteDC();
*/
return CView::OnEraseBkgnd(pDC);
//return TRUE;	//擦出了背景,则返回非0;否则调用基类函数会擦出已经显示的位图
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息