BeginPaint和GetDC的區別

2021-05-05 05:24:16 字數 1024 閱讀 7710

第一種情況顯示出來的字很正常。

case wm_paint:

gdc = beginpaint (hwnd, &ps);

textout (gdc, 0, 0, s, strlen (s));

endpaint (hwnd, &ps);

break;

第二種情況顯示的字不停閃爍。

case wm_paint:

gdc = getdc (hwnd);

textout (gdc, 0, 0, s, strlen (s));

releasedc (hwnd, gdc);

break;

這兩者的區別在於:

beginpaint() 

和endpaint() 可以刪除訊息佇列中的wm_paint訊息,並使無效區域有效。

getdc()和releasedc()並不刪除也不能使無效區域有效,因此當程式跳出wm_paint 時,無效區域仍然存在。系統就回不斷傳送wm_paint訊息,於是程式不斷處理wm_paint訊息。相當於beginpaint、endpaint會告訴gdi內部,這個視窗需要重畫的地方已經重畫了,這樣wm_paint處理完返回給系統後,系統不會再重發wm_paint,而getdc沒有告訴系統這個視窗需要重畫的地方已經畫過,在你把程式返回給系統後,系統一直以為通知你的重畫命令你還沒有乖乖的執行或者執行出錯,所以在訊息空閒時,它還會不斷地發wm_paint催促你畫,導致程式卡死。

可見beginpaint、endpaint是比較「被動」的,只在視窗新建時和被摧殘時才重畫。

而getdc用於主動繪製,只要你指到哪,它就打到哪。它不加判斷就都畫上去,無效區域跟它沒關係。對話方塊沒被覆蓋沒被摧殘,它很健康,系統沒要求它重畫,但開發者有些情況下需要它主動重畫:比如乙個定時換外觀的視窗,這時候就要在wm_timer處理**用getdc。這時候再用beginpaint、endpaint的話,會因為無效區域為空,所有繪畫操作都將被過濾掉。

**自:

Win32中BeginPaint和GetDC的使用

這是正確的方式,重要的事情說三遍 wm paint 1.單獨使用getdc時,視窗畫面會一直閃爍,cpu占用會一直提高,大概到10 後面程式直接卡死,出現程式畫面卡頓不能操作的情況 2.一起使用getdc和beginpaint時,視窗畫面不會一直閃爍,但是。在視窗拖出螢幕外再拉進顯示器時,畫面會有閃...

和 區別和聯絡, 和 區別和聯絡

和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...

rpx和樣式和class和flex

5 style 靜態的樣式統一寫到 class 中。style 接收動態的樣式,在執行時會進行解析,請盡量避免將靜態的樣式寫進 style 中,以免影響渲染速度。例 6 class 用於指定樣式規則,其屬性值是樣式規則中類選擇器名 樣式類名 的集合,樣式類名不需要帶上.樣式類名之間用空格分隔。關於f...