win32畫窗體背景

2021-08-15 07:38:34 字數 1472 閱讀 2338

背景:

應產品需求將視窗載入時的loading.gif換了一張,原先是白底的gif,然後換了一張黑底的gif,放上去真的好醜,因為窗體的背景色是白色。

然後就需要我給窗體畫個背景顏色融合這個新的gif,踩了很多opengl、ondraw等很多坑,這裡先po一下**

void onpaint(hdc hdc)

}

這個**把黑色背景畫出來了。

原理:窗體建立之後,在註冊的訊息迴圈類winproc裡接受

case

wm_paint:

break;

}

這樣就可以在窗體建立之後呼叫onpaint,所以我在onpaint中實現畫背景這個功能。

但是執行發現上面的**其實是有問題的,我的loading一直在閃爍。查閱資料後說需要實現雙緩衝,這是我當時網上找到的**

hdc memdc = createcompatibledc(hdc);//記憶體dc   

hbitmap membitmap = createcompatiblebitmap(hdc, width, height); //建立和螢幕相容的bitmap

hbitmap holdbitmap = (hbitmap)selectobject(memdc, membitmap);//將membitmap選入記憶體dc

//這裡在memdc上繪製

//貼圖到目標dc

bitblt(hdc, 0, 0, width, height, memdc, 0, 0, srccopy);

//結束清理

selectobject(memdc, holdbitmap);

deleteobject(membitmap);

deletedc(memdc);

因為畫的時候是乙個畫素乙個畫素畫的,每畫一筆窗體都會重新整理一次,所以會出現閃爍的現象,而雙緩衝是在窗體裡建立乙個緩衝池,緩衝池滿的時候再重新整理,而且重新整理的是緩衝區而不是窗體

這是我雙緩衝的**

void onpaint(hdc hdc)

//貼圖到目標dc

bitblt(hdc, 0, 0, width, height, memdc, 0, 0, srccopy);

//結束清理

selectobject(memdc, holdbitmap);

deleteobject(membitmap);

deletedc(memdc);

}}

到這裡邏輯基本就正確了,但是執行發現閃爍的更厲害了。

排查分析後發現有一處錯誤:(9)我在**裡標了。

hbitmap holdbitmap這個不能建立臨時變數,所以我在類裡定義了hbitmap holdbitmap變數,在函式裡直接用,而不是重新定義。

ok,完美的解決把黑色gif放進去了

工作原因不方便放圖~

Win32窗體建立

include 視窗過程函式 lresult callback wndproc hwnd hwnd,uint umsg,wparam wparam,lparam lparam return defwindowproc hwnd,umsg,wparam,lparam int winapi winmai...

win32畫正弦曲線

include include 數學函式 include c 格式化字串需要 using namespace std lresult callback mywndproc hwnd hwnd,uint umsg,wparam wparam,lparam lparam int winapi winma...

win32動態生成窗體選單

include windows.h define id file exit 9001 定義選單的id號 define id stuff go 9002 const char g szclassname mywindowsclass 定義視窗類的名稱陣列 lresult callback wndpro...