タスク マネージャーを使用して動的に作成されたコントロールを監視していたところ、ImageList を使用して TreeView を作成するたびに、ツリーを破棄して再度作成するたびにGDI オブジェクトの数が 4 ずつ増加することがわかりました。ただし、ListView には問題はありませんでした。
私TVS_CHECKBOXES
は状態イメージの問題を知っており、すでに状態イメージリストを破棄していましたが、実装しました:
ImageList_Destroy(TreeView_SetImageList(GetHandle(), nullptr, TVSIL_NORMAL));
そして今、リソースリークはなくなりました。
これまでのところ、次の場合は手動で画像をクリーンアップする必要があるようですWM_DESTROY
:
Button_SetImageList() - Have to set it to switch it to `BUTTON_IMAGELIST.himl=BCCL_NOGLYPH` to clear it.
TreeView_SetImageList(LVILS_STATE) - if you set it or used `TVS_CHECKBOXES`
TreeView_SetImageList(LVILS_NORMAL) - if you set it
BM_SETIMAGE and STM_SETIMAGE - destroy your own but also set to NULL and destroy returned handle to get rid of potential hidden bitmap handle if different handle than your own.
しかし、ListViewは異なります。それは設計によるものですか、それともWM_DESTROY
次のようなものを先に進める必要がありますか:
ImageList_Destroy(ListView_SetImageList(GetHandle(), nullptr, LVSIL_STATE));
ImageList_Destroy(ListView_SetImageList(GetHandle(), nullptr, LVSIL_SMALL));
ImageList_Destroy(ListView_SetImageList(GetHandle(), nullptr, LVSIL_NORMAL));
WM_NCDESTROY
TreeView の使用は遅すぎることに注意してください。