我使用CListBox :: SetItemData來存儲一個指向我的ownerdrawn CListBox派生類中的某些數據的指針,並且我希望列表框本身能夠跟蹤它並在不再需要時釋放內存。當列表框中有一個項目被刪除時收到通知?
爲此,我需要在每次刪除項目時收到通知(包括LB_RESETCONTENT和刪除項目的其他每種情況)。是否有一個或多個事件可以實現?
我使用CListBox :: SetItemData來存儲一個指向我的ownerdrawn CListBox派生類中的某些數據的指針,並且我希望列表框本身能夠跟蹤它並在不再需要時釋放內存。當列表框中有一個項目被刪除時收到通知?
爲此,我需要在每次刪除項目時收到通知(包括LB_RESETCONTENT和刪除項目的其他每種情況)。是否有一個或多個事件可以實現?
正如它的主人用的LBS_OWNERDRAW*
樣式可以一個畫尋找WM_DELETEITEM
;
發送到列表框或組合框的所有者時,列表框或 組合框被破壞,或當由所述
LB_DELETESTRING
,LB_RESETCONTENT
,CB_DELETESTRING
,或CB_RESETCONTENT
消息被刪除的項目。該系統將刪除的消息WM_DELETEITEM
每個 項目
不。ListBox僅爲用戶所做的事情生成通知。用戶無法刪除或添加或清空列表框,只能由您自己的代碼完成。所以這裏的哲學是控制不必告訴你一些你已經知道的東西。您可以在修改內容的代碼中隨意生成自己的消息。當然,從CListBox繼承自己的類並添加自己的虛擬方法會更好。
這很容易 - 只要繼承列表框中,並添加消息處理LB_DELETESTRING和LB_RESETCONTENT
看到這裏的細節:
既然你已經繼承列表框反正「適當」的設計會(IMO)是數據管理功能添加到列表框中,然後就知道當項目被刪除時,可以根據需要刪除數據。我的意思是,讓我們說你的列表跟蹤人,你會添加AddPerson(Person p)和RemovePerson(Person p)方法到你的班級。 RemovePerson的實現將從列表中刪除相應條目,並刪除與其相關的所有數據。所以,不要使用CListBox :: DeleteString來刪除東西,而是使用自己實現的更高級別的API。
如果對話框仍然有物品被銷燬,它會得到LB_RESETCONTENT,還是我還必須處理WM_DESTROY,會發生什麼? – sashoalm 2012-04-11 14:01:47
你也應該處理WM_DESTROY – Isso 2012-04-11 15:22:48