總結windows中的GDI物件以及使用

2021-09-22 08:15:25 字數 1424 閱讀 6945

之前有乙個專案因為那時對c++還不太熟悉,沒有太多經驗,造成了記憶體洩漏、執行緒同步、gdi物件洩漏等新手常見的問題,所以這個程式會不定時地莫名其妙地死掉,後來通過用visual leak detector小心翼翼地解決了記憶體洩漏的問題,接著系統就穩定了很多,而且也重新看了多執行緒那部分,加了多個鎖,也總算解決了執行緒同步的問題。然而系統還是隔一段時間死掉,後來在任務管理器裡發現其」gdi物件「只增不減,原來還有gdi物件洩漏啊,這個好像在網上都找不到什麼軟體進行檢測,後來查了半日資料,發現原來建立的gdi物件都必須呼叫相應的方法進行銷毀。如下表:

gdi物件

產生方法

銷毀方法

位圖(hbitmap)

createbitmap,createbitmapindirect,

createcompatiblebitmap,createdibitmap,

createdibsection,creatediscardablebitmap

deleteobject

畫刷(hbrush)

createbrushindirect,createdibpatternbrush,

createdibpatternbrushpt,createhatchbrush,

createpatternbrush,createsolidbrush

deleteobject

裝置上下文(hdc)

createdc

deletedc,releasedc

字型(hfont)

createfont,createfontindirect

deleteobject

記憶體dc(hdc)

createcompatibledc

deletedc

調色盤(hpalette)

createpalette

deleteobject

畫筆(hpen)

createpen,createpenindirect

deleteobject

區域(hrgn)

combinergn,createellipticrgn,

createellipticrgnindirect,createpolygonrgn,

createpolypolygonrgn,createrectrgn,

createrectrgnindirect,createroundrectrgn,

deleteobject

這裡還有乙個問題需要注意,就是裝置dc需要呼叫selectobject方法來選取不同的gdi物件,當選擇gdi物件時必須用乙個指標記錄替換出來的物件,當要結束繪圖的時候再用該dc呼叫selectobject方法把替換出來的物件放回去,這時呼叫以上的銷毀方法才能成功,要不也是不能清除gdi物件的,切記。

對GDI中的GradientFill的封裝

在msdn中graphic section部分有兩個api是拿來單獨描述的,他們分別是alphablend和gradientfill,alphablend的參數列類似bitble,但gradientfill,從它們的參數列能看出它比較複雜,於是我做了封裝 bool gradientfill hdc ...

C 中的 gdi 而不是 gdi

我記得有多種方法的,不過我現在的部分資料還沒恢復,下面這個是的.我記得我用是因為 gdi 的字串繪畫時無法限制在區域內,而 gdi 是可以的.這實在是奇怪.2009 09 02 14 20 08 最近重寫tabcontrol控制項,但是發現tab與其中的字型長度不合適,我希望長度應該是正合適的情況。...

對Windows訊息傳遞機制的總結

當某應用程式有某一事件發生時,作業系統接受此訊息。訊息也分為佇列化和非佇列化的。佇列化的訊息由windows放入程式訊息佇列中,在程式的訊息迴圈中重新傳回並分配給視窗訊息處理程式 windosw呼叫winproc函式 非佇列化的訊息在windows呼叫視窗時直接送給訊息處理程式。至於那些是佇列化,那...