分析:
首先,我們要明確一點,窗口的繪制包括兩個步驟,首先:擦除窗口背景,然后再對窗口重新進行繪制;當擦除窗口背景時,程序會發生一個WM_ERASEBKGND消息,因此可以在此響應函數中完成位圖的顯示。代碼如下:
1 BOOL CGraphicView::OnEraseBkgnd(CDC* pDC) 2 { 3 // TODO: 在此添加消息處理程序代碼和/或調用默認值 4 CBitmap bitmap; 5 bitmap.LoadBitmapA( IDB_BITMAP1 ); 6 7 BITMAP bmp; 8 bitmap.GetBitmap( &bmp ); // 該結構體bmp可以獲取有關位圖的信息 9 10 11 CDC dcCompatible; 12 dcCompatible.CreateCompatibleDC( pDC ); // 創建與當前DC(pDC)兼容的DC 13 dcCompatible.SelectObject( &bitmap ); 14 15 CRect rect; 16 GetClientRect( &rect ); 17 18 /** 法一:將兼容DC中的位圖復制到目的DC中,該函數是1:1復制的,不會伸縮和壓縮位圖; 19 pDC->BitBlt( 0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY ); 20 */ 21 22 // 法二:可以按照指定大小實現位圖的伸縮和拉伸 23 pDC->StretchBlt( 0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY ); 24 25 // return CView::OnEraseBkgnd(pDC); // 不要調用基類的方法,否則會擦除背景 26 return TRUE; 27 }
上述代碼是在窗口顯示更新的第一步,即擦除窗口背景這一步實現位圖的顯示,在實現時,也可以在窗口顯示更新的第二步,即重繪窗口時實現這個功能。即將上述代碼放在OnDraw函數中實現,可以發現結果都是一樣的,但是效果稍有差別,當窗口尺寸發送變化時,程序窗口會有閃爍現象,這是因為當窗口尺寸變化時,會引起窗口重繪操作,它會首先擦除背景,然后在OnDraw函數中再重新貼上位圖,而第一種實現方式下,窗口閃爍比較小,因為我們沒有擦除背景,而是直接貼上位圖
