MFC雙緩衝顯示位圖

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;否則調用基類函數會擦出已經顯示的位圖
}


發佈了28 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章