物件與資源

2021-06-14 02:18:58 字數 1741 閱讀 7348

物件與資源

還是以進度欄為例

在自定義訊息中,進度欄建立完成後,還存在一些問題。

問題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...