物件與資源
還是以進度欄為例
在自定義訊息中,進度欄建立完成後,還存在一些問題。
問題1:
建立完成後,當移動視窗,進度欄只能存在於固定的位置,並不能隨碰著視窗大小改變而改變。
原因:
當視窗的尺寸區域發生變化的時候,那麼狀態列的尺寸區域也要發生變化,
那麼,最早所獲取的窗格也就不準確了,所以就看到進度欄脫離了狀態列上的方格。
解決:
避免這種情況就需要在視窗發生變化時,重新去獲取固定索引的區域,然後將進度欄移動到這個
區域馮馮當中。
傳送wm_paint的訊息,在這裡面重新獲取窗格的矩形區域,然後將其重新移動至距形區域
在cmianframe中新增wm_paint訊息。並新增處理函式。如下:
void cmainframe::onpaint()
那麼是不是這做就ok 了?執行之後,會發生如下錯誤:
這是為什麼?通過除錯,設定斷點。
在進行初始化的時候,先執行至上面。然後
又到onpaint函式中,rect 值的變化和物件m_progres變化如下圖:
然後又執行至onprogress()函式當中,以再次呼叫到物件m_progress 也同時建立使用相同的資源
然後進而出如上的錯誤。
經過跟蹤發現,生成的過程,用相同的物件即為m_progress用到了兩次,並且同一物件,用到建立相同的資源,所以
會出錯。
就是說必須把物件相關的資源銷毀,才能重新呼叫
解決方案:可以把postmessage()注釋掉,即然用到onpaint()進行重繪,就不需要自定義訊息了。
但這樣已經行了嗎?當生成視窗後我們拉動視窗,其大小發生變化,還是會發生如圖一的錯誤!
其實還是一樣的錯誤 ,當視窗發生改變時候,就會傳送乙個wm_paint的訊息,於是就會呼叫onpaint()這個訊息
響應函式,因為我們已經建立進度欄,並且已經將它與cprogressctrl物件相關聯,又一次去建立,當然會發生問題。
可以在onpaint函式 中進行判斷:物件m_progress是否關聯了相關的資源?
void cmainframe::onpaint()
else
m_progess.movewindow(rect);
m_progess.setpos(50);
// todo: 在此處新增訊息處理程式**
// 不為繪圖訊息呼叫 cframewnd::onpaint()
}
WPF物件級資源的定義與查詢
文章概述 本演示介紹了怎樣定義wpf物件級的資源,並通過xaml 和c 訪問和使用物件級資源。一 完整的定義和使用資源 沉舟側畔千帆過,病樹前頭萬木春。3.1415926 二 簡寫的資源定義和使用 沉舟側畔千帆過。病樹前頭萬木春。3.1415926 三 查詢資源 通常的做法例如以下所看到的 stri...
物件管理資源
今天看了下effective c 的條款13 以物件管理資源,感覺十分有理,特此做一下筆記。假設我們使用乙個用來描述投資行為的程式庫,其中各式各樣的投資型別都繼承自乙個根類 investment 投資型別繼承體系中的root class class investment 這裡呢,我們進一步假設這個程...
以物件來管理資源
c 中區域性變數在作用域裡的構造和析構行為,為資源的管理提供了靈活安全的解決之道。下面以多執行緒的鎖來舉例 ifndef lock h define lock hclass lock endif lock h include lock.h lock lock mutex m mutex m lock...