diff --git a/include/wx/bitmap.h b/include/wx/bitmap.h index ea2322597f..baf02d10ad 100644 --- a/include/wx/bitmap.h +++ b/include/wx/bitmap.h @@ -243,7 +243,11 @@ protected: #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM #include "wx/x11/bitmap.h" #elif defined(__WXGTK20__) - #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #ifdef __WINDOWS__ + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_BMP_RESOURCE + #else + #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #endif #include "wx/gtk/bitmap.h" #elif defined(__WXGTK__) #define wxBITMAP_DEFAULT_TYPE wxBITMAP_TYPE_XPM diff --git a/include/wx/cursor.h b/include/wx/cursor.h index 55b4043cf8..66d8899419 100644 --- a/include/wx/cursor.h +++ b/include/wx/cursor.h @@ -41,7 +41,11 @@ public: #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XBM #include "wx/motif/cursor.h" #elif defined(__WXGTK20__) - #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #ifdef __WINDOWS__ + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE + #else + #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #endif #include "wx/gtk/cursor.h" #elif defined(__WXGTK__) #define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_XPM diff --git a/include/wx/gdicmn.h b/include/wx/gdicmn.h index 3ef7d6c98c..e6368d8ff2 100644 --- a/include/wx/gdicmn.h +++ b/include/wx/gdicmn.h @@ -174,7 +174,7 @@ enum wxStockCursor wxIcon *icon = new wxIcon(sample_xpm); // On wxGTK/Linux */ -#ifdef __WXMSW__ +#ifdef __WINDOWS__ // Load from a resource #define wxICON(X) wxIcon(wxT(#X)) #elif defined(__WXPM__) @@ -204,7 +204,7 @@ enum wxStockCursor under Unix bitmaps live in XPMs and under Windows they're in ressources. */ -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WINDOWS__) || defined(__WXPM__) #define wxBITMAP(name) wxBitmap(wxT(#name), wxBITMAP_TYPE_BMP_RESOURCE) #elif defined(__WXGTK__) || \ defined(__WXMOTIF__) || \ diff --git a/include/wx/icon.h b/include/wx/icon.h index 3b7b9b20a5..5eebb3f38e 100644 --- a/include/wx/icon.h +++ b/include/wx/icon.h @@ -30,7 +30,11 @@ #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM #include "wx/motif/icon.h" #elif defined(__WXGTK20__) - #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #ifdef __WINDOWS__ + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_ICO_RESOURCE + #else + #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM + #endif #include "wx/generic/icon.h" #elif defined(__WXGTK__) #define wxICON_DEFAULT_TYPE wxBITMAP_TYPE_XPM diff --git a/src/common/image.cpp b/src/common/image.cpp index ef7fb58dd9..a3a5f0ada6 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -2235,10 +2235,102 @@ bool wxImage::HasOption(const wxString& name) const // image I/O // ---------------------------------------------------------------------------- -bool wxImage::LoadFile( const wxString& WXUNUSED_UNLESS_STREAMS(filename), - wxBitmapType WXUNUSED_UNLESS_STREAMS(type), +// Under Windows we can load wxImage not only from files but also from +// resources. +#if defined(__WINDOWS__) && wxUSE_WXDIB && wxUSE_IMAGE + #define HAS_LOAD_FROM_RESOURCE +#endif + +#ifdef HAS_LOAD_FROM_RESOURCE + +#include "wx/msw/dib.h" +#include "wx/msw/private.h" + +static wxImage LoadImageFromResource(const wxString &name, wxBitmapType type) +{ + AutoHBITMAP + hBitmap, + hMask; + + if ( type == wxBITMAP_TYPE_BMP_RESOURCE ) + { + hBitmap = ::LoadBitmap(wxGetInstance(), name.t_str()); + + if ( !hBitmap ) + { + wxLogError(_("Failed to load bitmap \"%s\" from resources."), name); + } + } + else if ( type == wxBITMAP_TYPE_ICO_RESOURCE ) + { + const HICON hIcon = ::LoadIcon(wxGetInstance(), name.t_str()); + + if ( !hIcon ) + { + wxLogError(_("Failed to load icon \"%s\" from resources."), name); + } + else + { + ICONINFO info; + if ( !::GetIconInfo(hIcon, &info) ) + { + wxLogLastError(wxT("GetIconInfo")); + return wxImage(); + } + + hBitmap = info.hbmColor; + hMask = info.hbmMask; + } + } + else if ( type == wxBITMAP_TYPE_CUR_RESOURCE ) + { + wxLogDebug(wxS("Loading cursors from resources is not implemented.")); + } + else + { + wxFAIL_MSG(wxS("Invalid bitmap resource type.")); + } + + if ( !hBitmap ) + return wxImage(); + + wxImage image = wxDIB(hBitmap).ConvertToImage(); + if ( hMask ) + { + const wxImage mask = wxDIB(hMask).ConvertToImage(); + image.SetMaskFromImage(mask, 255, 255, 255); + } + else + { + // Light gray colour is a default mask + image.SetMaskColour(0xc0, 0xc0, 0xc0); + } + + image.InitAlpha(); + + return image; +} + +#endif // HAS_LOAD_FROM_RESOURCE + +bool wxImage::LoadFile( const wxString& filename, + wxBitmapType type, int WXUNUSED_UNLESS_STREAMS(index) ) { +#ifdef HAS_LOAD_FROM_RESOURCE + if ( type == wxBITMAP_TYPE_BMP_RESOURCE + || type == wxBITMAP_TYPE_ICO_RESOURCE + || type == wxBITMAP_TYPE_CUR_RESOURCE) + { + const wxImage image = ::LoadImageFromResource(filename, type); + if ( image.IsOk() ) + { + *this = image; + return true; + } + } +#endif // HAS_LOAD_FROM_RESOURCE + #if HAS_FILE_STREAMS wxImageFileInputStream stream(filename); if ( stream.IsOk() )