X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..12bb29f5432174ecbd65549bda832d70d34a98ae:/src/msw/icon.cpp diff --git a/src/msw/icon.cpp b/src/msw/icon.cpp index a7e1fcad9d..dccefc51cc 100644 --- a/src/msw/icon.cpp +++ b/src/msw/icon.cpp @@ -1,12 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/icon.cpp +// Name: src/msw/icon.cpp // Purpose: wxIcon class // Author: Julian Smart // Modified by: 20.11.99 (VZ): don't derive from wxBitmap any more // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "icon.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -29,26 +25,21 @@ #endif #ifndef WX_PRECOMP - #include "wx/defs.h" #include "wx/list.h" #include "wx/utils.h" #include "wx/app.h" #include "wx/icon.h" #include "wx/bitmap.h" + #include "wx/log.h" #endif #include "wx/msw/private.h" -#if wxUSE_RESOURCE_LOADING_IN_MSW - #include "wx/msw/curico.h" - #include "wx/msw/curicop.h" -#endif - // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxIconBase) +IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxGDIObject) // ============================================================================ // implementation @@ -62,7 +53,9 @@ void wxIconRefData::Free() { if ( m_hIcon ) { +#ifndef __WXMICROWIN__ ::DestroyIcon((HICON) m_hIcon); +#endif m_hIcon = 0; } @@ -79,51 +72,50 @@ wxIcon::wxIcon(const char bits[], int width, int height) } wxIcon::wxIcon(const wxString& iconfile, - long flags, + wxBitmapType type, int desiredWidth, int desiredHeight) { - LoadFile(iconfile, flags, desiredWidth, desiredHeight); + LoadFile(iconfile, type, desiredWidth, desiredHeight); } -wxIcon::~wxIcon() +wxIcon::wxIcon(const wxIconLocation& loc) { -} - -void wxIcon::CopyFromBitmap(const wxBitmap& bmp) -{ -#ifdef __WIN32__ - wxMask *mask = bmp.GetMask(); - if ( !mask ) + // wxICOFileHandler accepts names in the format "filename;index" + wxString fullname = loc.GetFileName(); + if ( loc.GetIndex() ) { - // we must have a mask for an icon, so even if it's probably incorrect, - // do create it (grey is the "standard" transparent colour) - mask = new wxMask(bmp, *wxLIGHT_GREY); + fullname << wxT(';') << loc.GetIndex(); } + //else: 0 is default - ICONINFO iconInfo; - iconInfo.fIcon = TRUE; // we want an icon, not a cursor - iconInfo.hbmMask = wxInvertMask((HBITMAP)mask->GetMaskBitmap()); - iconInfo.hbmColor = GetHbitmapOf(bmp); - - /* GRG: black out the transparent area to preserve background - * colour, because Windows blits the original bitmap using - * SRCINVERT (XOR) after applying the mask to the dest rect. - */ - HDC dcSrc = ::CreateCompatibleDC(NULL); - HDC dcDst = ::CreateCompatibleDC(NULL); - SelectObject(dcSrc, (HBITMAP)mask->GetMaskBitmap()); - SelectObject(dcDst, iconInfo.hbmColor); + LoadFile(fullname, wxBITMAP_TYPE_ICO); +} - BitBlt(dcDst, 0, 0, bmp.GetWidth(), bmp.GetHeight(), dcSrc, 0, 0, SRCAND); +wxIcon::~wxIcon() +{ +} - SelectObject(dcDst, NULL); - SelectObject(dcSrc, NULL); - DeleteDC(dcDst); - DeleteDC(dcSrc); +wxObjectRefData *wxIcon::CloneRefData(const wxObjectRefData *dataOrig) const +{ + const wxIconRefData * + data = static_cast(dataOrig); + if ( !data ) + return NULL; + + // we don't have to copy m_hIcon because we're only called from SetHICON() + // which overwrites m_hIcon anyhow currently + // + // and if we're called from SetWidth/Height/Depth(), it doesn't make sense + // to copy it neither as the handle would be inconsistent with the new size + return new wxIconRefData(*data); +} - HICON hicon = ::CreateIconIndirect(&iconInfo); +void wxIcon::CopyFromBitmap(const wxBitmap& bmp) +{ +#ifndef __WXMICROWIN__ + HICON hicon = wxBitmapToHICON(bmp); if ( !hicon ) { wxLogLastError(wxT("CreateIconIndirect")); @@ -133,36 +125,17 @@ void wxIcon::CopyFromBitmap(const wxBitmap& bmp) SetHICON((WXHICON)hicon); SetSize(bmp.GetWidth(), bmp.GetHeight()); } - - if ( !bmp.GetMask() ) - { - // we created the mask, now delete it - delete mask; - } -#else // Win16 - // there are some functions in curico.cpp which probably could be used - // here... - // This probably doesn't work. - HBITMAP hBitmap = (HBITMAP) bmp.GetHBITMAP(); - HICON hIcon = MakeIconFromBitmap((HINSTANCE) wxGetInstance(), hBitmap); - if (hIcon) - { - SetHICON((WXHICON)hIcon); - SetSize(bmp.GetWidth(), bmp.GetHeight()); - } - -// wxFAIL_MSG("Bitmap to icon conversion (including use of XPMs for icons) not implemented"); -#endif // Win32/16 +#endif // __WXMICROWIN__ } -void wxIcon::CreateIconFromXpm(const char **data) +void wxIcon::CreateIconFromXpm(const char* const* data) { wxBitmap bmp(data); CopyFromBitmap(bmp); } bool wxIcon::LoadFile(const wxString& filename, - long type, + wxBitmapType type, int desiredWidth, int desiredHeight) { UnRef(); @@ -171,10 +144,26 @@ bool wxIcon::LoadFile(const wxString& filename, if ( !handler ) { - // say something? - return FALSE; + // load via wxBitmap which, in turn, uses wxImage allowing us to + // support more formats + wxBitmap bmp; + if ( !bmp.LoadFile(filename, type) ) + return false; + + CopyFromBitmap(bmp); + return true; } return handler->Load(this, filename, type, desiredWidth, desiredHeight); } +bool wxIcon::CreateFromHICON(WXHICON icon) +{ + SetHICON(icon); + if ( !IsOk() ) + return false; + + SetSize(wxGetHiconSize(icon)); + + return true; +}