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