Win32程式設計學習筆記

2021-09-30 08:42:36 字數 2240 閱讀 5598

之前也學了點window程式設計,但零零碎碎的,知識體系不完整。現在開始,邊複習邊學新知識。

下面都是在vs2010上寫的程式。

下面的程式是在視窗中打出字串,並當滑鼠左擊時畫乙個圓。

其中有一點要注意的,就是   beginpaint和getdc區別

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

getdc()和releasedc()並不刪除也不能使無效區域有效,因此當程式跳出 wm_paint 時 ,無效區域仍然存在。系統就回不斷傳送wm_paint訊息,於是程式不斷處理wm_paint訊息。

相當於beginpaint、endpaint會告訴gdi內部,這個視窗需要重畫的地方已經重畫了,這樣wm_paint處理完返回給系統後,系統不會再重發wm_paint,而getdc沒有告訴系統這個視窗需要重畫的地方已經畫過,在你把程式返回給系統後,系統一直以為通知你的重畫命令你還沒有乖乖的執行或者執行出錯,所以在訊息空閒時,它還會不斷地發wm_paint催促你畫,導致程式卡死。

無效區域 :

無效區域就是指需要重畫的區域,無效的意思是:當前內容是舊的,過時的。

假設a是新彈出的乙個對話方塊或被啟用的現有對話方塊,a對話方塊置於原來的活動對話方塊b前面,造成對話方塊b的部分或全部被覆蓋,當對話方塊a移開或關閉後,使對話方塊b原來被覆蓋的地方重新可見。那部分被覆蓋的地方就稱為無效區域。

只有當乙個視窗訊息空閒時,系統才會抽空檢查一下這個視窗的無效區域是否為非空(wm_paint的優先順序是最低的。這也就是為什麼系統很忙時視窗和桌面往往會出現變白、重新整理不了、留拖拽痕跡等現象的原因),如果非空,系統就傳送wm_paint。所以一定要用beginpaint、endpaint把無效區域設為空,否則wm_paint將一直被傳送。

為什麼windows要提出無效區域的概念?

這是為了加速。

因為beginpaint和endpaint用到的裝置描述符只會在當前的無效區域內繪畫,在有效區域內的繪畫會自動被過濾,大家都知道,win gdi的繪畫速度是比較慢的,所以能節省乙個象素就節省乙個,不用吝嗇,這樣可以有效加快繪畫速度。

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

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

eg:

我們都知道beginpaint()和endpaint()需要配套使用,並且這兩個函式也只能用在wm_paint訊息的相應函式當中.如果我們在 wm_paint的響應函式中將以上兩個繪製函式相應替換為getdc()和releasedc()會有什麼結果呢?

即:hdc hdc = beginpaint(hwnd,&ps);     -->    hdc hdc = getdc(hwnd);

endpaint(hwnd,&ps);                 -->    releasedc(hwnd,hdc);

編譯並執行程式,我們發現視窗一片空白,好像沒有繪製點陣圖.但其實不盡然,我們採用單步除錯,可以發現其實位圖已經繪製出來,只不過又被背景顏色抹掉了. 由此可知,如果需要使用getdc(),我們對訊息迴圈函式必須要加上對wm_erasebkgnd的處理:

lresult callback mainwndproc(hwnd hwnd,uint wmsg,wparam wparam,lparam lparam)

return defwindowproc(hwnd,wmsg,wparam,lparam);

}只要系統不對wm_erasebkgnd進行預設處理,我們用getdc()替代beginpaint()就可以正常使用.

至此我們可以看出beginpaint(),endpaint()和getdc(),releasedc()的區別.前一對只能用在wm_paint響應函式中,並且繪製背景時不會被抹掉;後一對隨處可用,但如果用在wm_paint響應函式中,那麼接下來將會被wm_erasebkgnd訊息的響應函式的背景繪製給抹掉.

2.繪圖閃爍問題       

有時候我們大量繪製螢幕時,可能會出現螢幕閃爍問題,這時候可以採用雙緩衝的做法.步驟首先是建立乙個記憶體dc,然後往記憶體dc中繪圖,最後把記憶體dc的內容複製到顯示dc中,完成繪製.具體過程並不複雜,結合**來說明一下.

ps:這段**也是相應wm_paint 訊息的.

Win32程式設計

win32 malloc函式的底層實現是win32api utf 16編碼以16位無符號整數為單位,注意是16位為乙個單位,不是乙個字元就只有16位,這個要看字元的unicode編碼處於什麼範圍而定,有可能是2個位元組,也可能是4個位元組現在機器上的unicode編碼一般就是指utf 16 以兩個位...

Win32學習筆記 WM PAINT

1.wm paint 的產生 wm paint 由於視窗的互相覆蓋等,產生需要繪製的區域,那麼就會產生wm paint訊息。一般情況下通過api宣告需要繪製的區域,來產生wm paint 例如,可以使用invalidaterect宣告乙個需要重新繪製的區域。2.wm paint的注意點 2.1 如果...

《Win32多執行緒程式設計》學習筆記 (1)

最近開始看 win32 多執行緒程式設計 感覺受益匪淺,寫出來的目的有兩個 一是想看看自己理解的程度,能否總結出作者真正想表達的內容。2是與大家共享。好了,廢話就不說那麼多了!文章開始講述了作業系統的演化,作者從早期的 ms dos1.0 版本單任務系統到 2.x的可以允許常駐程式 tsr 但是 m...