From e76628bcf7b35776efb01fd59c14830d2fb00a1d Mon Sep 17 00:00:00 2001 From: brianferguson Date: Tue, 5 Nov 2019 15:50:12 -0700 Subject: [PATCH] Dialogs: Properly destroy image lists. Closes #208 --- Library/DialogAbout.cpp | 20 +++++++++++++++++++- Library/DialogAbout.h | 5 +++++ Library/DialogManage.cpp | 17 ++++++++++++++++- Library/DialogManage.h | 3 +++ Library/DialogNewSkin.cpp | 20 +++++++++++++++++++- Library/DialogNewSkin.h | 4 ++++ 6 files changed, 66 insertions(+), 3 deletions(-) diff --git a/Library/DialogAbout.cpp b/Library/DialogAbout.cpp index f775f9f49..32a29fc74 100644 --- a/Library/DialogAbout.cpp +++ b/Library/DialogAbout.cpp @@ -323,10 +323,16 @@ DialogAbout::TabLog::TabLog() : Tab(), m_Error(true), m_Warning(true), m_Notice(true), - m_Debug(true) + m_Debug(true), + m_ImageList(nullptr) { } +DialogAbout::TabLog::~TabLog() +{ + DestroyImageList(); +} + void DialogAbout::TabLog::Create(HWND owner) { Tab::CreateTabWindow(15, 30, 570, 188, owner); @@ -430,9 +436,21 @@ void DialogAbout::TabLog::Initialize() item = GetControl(Id_DebugCheckBox); Button_SetCheck(item, BST_CHECKED); + DestroyImageList(); + m_ImageList = hImageList; + m_Initialized = true; } +void DialogAbout::TabLog::DestroyImageList() +{ + if (m_ImageList) + { + ImageList_Destroy(m_ImageList); + m_ImageList = nullptr; + } +} + /* ** Resizes window and repositions controls. ** diff --git a/Library/DialogAbout.h b/Library/DialogAbout.h index 17a83dd34..679f83730 100644 --- a/Library/DialogAbout.h +++ b/Library/DialogAbout.h @@ -55,6 +55,7 @@ class DialogAbout : public Dialog }; TabLog(); + ~TabLog(); void Create(HWND owner); virtual void Initialize(); @@ -68,10 +69,14 @@ class DialogAbout : public Dialog INT_PTR OnNotify(WPARAM wParam, LPARAM lParam); private: + void DestroyImageList(); + bool m_Error; bool m_Warning; bool m_Notice; bool m_Debug; + + HIMAGELIST m_ImageList; }; // Skins tab diff --git a/Library/DialogManage.cpp b/Library/DialogManage.cpp index 3d54f8c40..7138b8933 100644 --- a/Library/DialogManage.cpp +++ b/Library/DialogManage.cpp @@ -385,7 +385,8 @@ COLORREF DialogManage::TabSkins::s_NewSkinBkColor = RGB(229, 241, 251); // defau DialogManage::TabSkins::TabSkins() : Tab(), m_SkinWindow(), m_HandleCommands(false), - m_IgnoreUpdate(false) + m_IgnoreUpdate(false), + m_ImageListHandle(nullptr) { } @@ -397,6 +398,8 @@ DialogManage::TabSkins::~TabSkins() item = GetControl(Id_SkinsTreeView); RemoveWindowSubclass(item, &SkinsTreeViewSubclass, 1); + DestroyImageList(); + if (s_NewSkinBkBrush) { DeleteObject(s_NewSkinBkBrush); @@ -621,10 +624,22 @@ void DialogManage::TabSkins::Initialize() ComboBox_AddString(item, GetString(ID_STR_FADEIN)); ComboBox_AddString(item, GetString(ID_STR_FADEOUT)); + DestroyImageList(); + m_ImageListHandle = hImageList; + m_Initialized = true; m_HandleCommands = true; } +void DialogManage::TabSkins::DestroyImageList() +{ + if (m_ImageListHandle) + { + ImageList_Destroy(m_ImageListHandle); + m_ImageListHandle = nullptr; + } +} + void DialogManage::TabSkins::UpdateSelected(Skin* skin) { if (m_SkinWindow && m_SkinWindow == skin) diff --git a/Library/DialogManage.h b/Library/DialogManage.h index 38e31ded5..57e5a9aa1 100644 --- a/Library/DialogManage.h +++ b/Library/DialogManage.h @@ -101,6 +101,7 @@ class DialogManage : public Dialog void SetControls(); void DisableControls(bool clear = false); void ReadSkin(); + void DestroyImageList(); static LRESULT CALLBACK NewSkinButtonSubclass(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uId, DWORD_PTR data); @@ -116,6 +117,8 @@ class DialogManage : public Dialog bool m_HandleCommands; bool m_IgnoreUpdate; + HIMAGELIST m_ImageListHandle; + static HBRUSH s_NewSkinBkBrush; static COLORREF s_NewSkinBkColor; }; diff --git a/Library/DialogNewSkin.cpp b/Library/DialogNewSkin.cpp index f22236490..126e133e1 100644 --- a/Library/DialogNewSkin.cpp +++ b/Library/DialogNewSkin.cpp @@ -397,10 +397,16 @@ std::vector DialogNewSkin::TabNew::s_SortInfo; DialogNewSkin::TabNew::TabNew() : Tab(), m_IsRoot(true), m_CanAddResourcesFolder(false), - m_InRenameMode(false) + m_InRenameMode(false), + m_ImageList(nullptr) { } +DialogNewSkin::TabNew::~TabNew() +{ + DestroyImageList(); +} + void DialogNewSkin::TabNew::Create(HWND owner) { Tab::CreateTabWindow(15, 30, 270, 188, owner); @@ -472,9 +478,21 @@ void DialogNewSkin::TabNew::Initialize() item = GetControl(Id_ItemsTreeView); TreeView_SetImageList(item, hImageList, TVSIL_NORMAL); + DestroyImageList(); + m_ImageList = hImageList; + m_Initialized = true; } +void DialogNewSkin::TabNew::DestroyImageList() +{ + if (m_ImageList) + { + ImageList_Destroy(m_ImageList); + m_ImageList = nullptr; + } +} + INT_PTR DialogNewSkin::TabNew::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) diff --git a/Library/DialogNewSkin.h b/Library/DialogNewSkin.h index 4d4b8d1df..220ac653b 100644 --- a/Library/DialogNewSkin.h +++ b/Library/DialogNewSkin.h @@ -52,6 +52,7 @@ class DialogNewSkin : public Dialog }; TabNew(); + ~TabNew(); void Create(HWND owner); virtual void Initialize(); @@ -77,6 +78,7 @@ class DialogNewSkin : public Dialog SortInfo(bool t, std::wstring n) : type(t), name(n) {} }; + void DestroyImageList(); void UpdateParentPathLabel(); void UpdateParentPathTT(bool update); void AddTreeItem(bool isFolder); @@ -97,6 +99,8 @@ class DialogNewSkin : public Dialog HWND m_TreeEdit; HWND m_ParentPathTT; + HIMAGELIST m_ImageList; + static std::vector s_SortInfo; };