MFC中位圖的顯示


分析:

      首先,我們要明確一點,窗口的繪制包括兩個步驟,首先:擦除窗口背景,然后再對窗口重新進行繪制;當擦除窗口背景時,程序會發生一個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函數中再重新貼上位圖,而第一種實現方式下,窗口閃爍比較小,因為我們沒有擦除背景,而是直接貼上位圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM