MFC應用程序閃爍的問題

          在軟件綜合實習的時候,遇到了寫的mfc應用程序閃爍的問題,即:當放大縮小窗口的時候,重繪操作速度很慢,導致了mfc應用程序不流暢。

  假設新圖需要畫part_1,part_2,part_3三部分,如果採用直接畫圖的方法,就會相應三次WM_PAINT消息,每一次響應WM_PAINT消息,都要調用一次OnDraw()函數:首先用白色畫布覆蓋,然後再白色畫布上畫新圖。因此頻繁調用WM_PAINT會造成閃爍問題。

          如果只調用一次WM_PAINT呢?

          這就不會閃爍了,我們可以先在內存中建立一個畫布,將需要畫的內容先畫在畫布之中,然後將新的畫布統一畫入屏幕。

 以下是代碼,來源於baidu百科:


首先給出實現的程序,然後再解釋,同樣是在OnDraw(CDC *pDC)中:
CDC MemDC; //首先定義一個顯示設備對象
CBitmap MemBitmap;//定義一個位圖對象
//隨後建立與屏幕顯示兼容的內存顯示設備
MemDC.CreateCompatibleDC(NULL);
//這時還不能繪圖,因爲沒有地方畫 ^_^
//下面建立一個與屏幕顯示兼容的位圖,至於位圖的大小嘛,可以用窗口的大小,也可以自己定義(如:有滾動條時就要大於當前窗口的大小,在BitBlt時決定拷貝內存的哪部分到屏幕上)
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//將位圖選入到內存顯示設備中
//只有選入了位圖的內存顯示設備纔有地方繪圖,畫到指定的位圖上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色將位圖清除乾淨,這裏我用的是白色作爲背景
//你也可以用自己應該用的顏色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//繪圖
MemDC.MoveTo(……);
MemDC.LineTo(……);
//將內存中的圖拷貝到屏幕上進行顯示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//繪圖完成後的清理
//把前面的pOldBit選回來.在刪除MemBitmap之前要先從設備中移除它
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
MemDC.DeleteDC();


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