MFC應用程式閃爍的問題

2021-06-18 06:47:56 字數 1242 閱讀 1018

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

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

如果只呼叫一次wm_paint呢?

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

首先給出實現的程式,然後再解釋,同樣是在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();

MFC應用程式執行流程

extern c int winapi twinmain hinstance hinstance,hinstance hprevinstance,lptstr lpcmdline,int ncmdshow 這一下清楚了,mfc中的winmain函式其實什麼也沒做,只是呼叫了乙個函式afxwinmai...

MFC應用程式框架分析

一.sdk應用程式與mfc應用程式執行過程的對比 程式執行都要有入口函式,在之前的 c 教程中都是main函式,而 windows應用程式的入口函式是winmain函式 mfc程式也是從winmain函式開始的 下面雞啄公尺就給出用 windows sdk寫的 helloworld 程式,與mfc應...

MFC應用程式執行流程

cmainframe 框架視窗 ctestview 子視窗 ctestdoc 資料文件 vc 下的mfc應用程式執行流程 然後進入到 twinmain hinstance hinstance hinstance hprevinstance,lpstr lpcmdline int ncmdshow 再...