From: Vadim Zeitlin Date: Sun, 10 Feb 2013 16:13:37 +0000 (+0000) Subject: Add wxIcon::CreateFromHICON() to wxMSW. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/973abcbb6acfbc5985191ff655c233a80c98754e Add wxIcon::CreateFromHICON() to wxMSW. Provide a public method properly assigning an HICON to wxIcon, instead of asking people to call SetHICON() and SetSize(). Closes #15023. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73489 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 1cc4395a70..2d107a109c 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -647,6 +647,7 @@ wxMSW: - Fix changing labels of menu items with bitmaps (Daniel Hyams). - Fix appearance of multiline coloured wxCheckBox (Catalin Raceanu). - Allow creating wxCursor from ANI files (Catalin Raceanu). +- Add wxIcon::CreateFromHICON() (troelsk). wxOSX/Cocoa: diff --git a/include/wx/msw/icon.h b/include/wx/msw/icon.h index 21f8abd6b4..268677d21b 100644 --- a/include/wx/msw/icon.h +++ b/include/wx/msw/icon.h @@ -65,6 +65,8 @@ public: wxBitmapType type = wxICON_DEFAULT_TYPE, int desiredWidth = -1, int desiredHeight = -1); + bool CreateFromHICON(WXHICON icon); + // implementation only from now on wxIconRefData *GetIconData() const { return (wxIconRefData *)m_refData; } diff --git a/interface/wx/icon.h b/interface/wx/icon.h index 083bce7534..8bbf0c5c1f 100644 --- a/interface/wx/icon.h +++ b/interface/wx/icon.h @@ -179,6 +179,22 @@ public: */ virtual ~wxIcon(); + /** + Attach a Windows icon handle. + + This wxMSW-specific method allows to assign a native Windows @c HICON + (which must be castes to @c WXHICON opaque handle type) to wxIcon. + Notice that this means that the @c HICON will be destroyed by wxIcon + when it is destroyed. + + @return @true if successful. + + @onlyfor{wxmsw} + + @since 2.9.5 + */ + bool CreateFromHICON(WXHICON icon); + /** Returns disabled (dimmed) version of the icon. diff --git a/src/msw/gdiimage.cpp b/src/msw/gdiimage.cpp index 845cbb3d69..d19d26afd9 100644 --- a/src/msw/gdiimage.cpp +++ b/src/msw/gdiimage.cpp @@ -432,9 +432,6 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon, { icon->UnRef(); - // actual size - wxSize size; - HICON hicon = NULL; // Parse the filename: it may be of the form "filename;n" in order to @@ -515,25 +512,23 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon, return false; } - size = wxGetHiconSize(hicon); + if ( !icon->CreateFromHICON(hicon) ) + return false; - if ( (desiredWidth != -1 && desiredWidth != size.x) || - (desiredHeight != -1 && desiredHeight != size.y) ) + if ( (desiredWidth != -1 && desiredWidth != icon->GetWidth()) || + (desiredHeight != -1 && desiredHeight != icon->GetHeight()) ) { wxLogTrace(wxT("iconload"), wxT("Returning false from wxICOFileHandler::Load because of the size mismatch: actual (%d, %d), requested (%d, %d)"), - size.x, size.y, + icon->GetWidth(), icon->GetHeight(), desiredWidth, desiredHeight); - ::DestroyIcon(hicon); + icon->UnRef(); return false; } - icon->SetHICON((WXHICON)hicon); - icon->SetSize(size.x, size.y); - - return icon->IsOk(); + return true; } bool wxICOResourceHandler::LoadIcon(wxIcon *icon, @@ -593,12 +588,7 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon, } #endif - wxSize size = wxGetHiconSize(hicon); - icon->SetSize(size.x, size.y); - - icon->SetHICON((WXHICON)hicon); - - return icon->IsOk(); + return icon->CreateFromHICON((WXHICON)hicon); } #if wxUSE_PNG_RESOURCE_HANDLER diff --git a/src/msw/icon.cpp b/src/msw/icon.cpp index fdd9d501c3..dccefc51cc 100644 --- a/src/msw/icon.cpp +++ b/src/msw/icon.cpp @@ -156,3 +156,14 @@ bool wxIcon::LoadFile(const wxString& filename, return handler->Load(this, filename, type, desiredWidth, desiredHeight); } + +bool wxIcon::CreateFromHICON(WXHICON icon) +{ + SetHICON(icon); + if ( !IsOk() ) + return false; + + SetSize(wxGetHiconSize(icon)); + + return true; +}