X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8f177c8e7309c8cf3ece1563870d135cc8f0e6a1..211cc8dc907ee50ca6d383b8df16bba9a4d3ce2d:/src/msw/statbmp.cpp?ds=sidebyside diff --git a/src/msw/statbmp.cpp b/src/msw/statbmp.cpp index da32aead68..f51c590ce6 100644 --- a/src/msw/statbmp.cpp +++ b/src/msw/statbmp.cpp @@ -28,6 +28,8 @@ #pragma hdrstop #endif +#if wxUSE_STATBMP + #include "wx/window.h" #include "wx/msw/private.h" @@ -42,7 +44,7 @@ // macors // --------------------------------------------------------------------------- - IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl) // =========================================================================== // implementation @@ -80,8 +82,31 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, m_windowStyle = style; + // we may have either bitmap or icon: if a bitmap with mask is passed, we + // will transform it to an icon ourselves because otherwise the mask will + // be ignored by Windows + wxIcon *icon = (wxIcon *)NULL; m_isIcon = bitmap.IsKindOf(CLASSINFO(wxIcon)); +#ifdef __WIN16__ + wxASSERT_MSG( !m_isIcon, "Icons are not supported in wxStaticBitmap under WIN16." ); +#endif + +#ifndef __WIN16__ + if ( !m_isIcon ) + { + const wxBitmap& bmp = (const wxBitmap&)bitmap; + wxMask *mask = bmp.GetMask(); + if ( mask && mask->GetMaskBitmap() ) + { + icon = new wxIcon; + icon->CopyFromBitmap(bmp); + + m_isIcon = TRUE; + } + } +#endif + #ifdef __WIN32__ // create a static control with either SS_BITMAP or SS_ICON style depending // on what we have here @@ -92,11 +117,16 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, int winstyle = BS_OWNERDRAW; #endif // Win32 + if ( m_windowStyle & wxCLIP_SIBLINGS ) + winstyle |= WS_CLIPSIBLINGS; + + m_hWnd = (WXHWND)::CreateWindow ( classname, wxT(""), - winstyle | WS_CHILD | WS_VISIBLE, + // NOT DISABLED!!! We want to move it in Dialog Editor. + winstyle | WS_CHILD | WS_VISIBLE /* | WS_CLIPSIBLINGS */ , // | WS_DISABLED, 0, 0, 0, 0, (HWND)parent->GetHWND(), (HMENU)m_windowId, @@ -106,7 +136,8 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") ); - SetImage(bitmap); + SetImage(icon ? icon : &bitmap); + delete icon; // may be NULL, ok // Subclass again for purposes of dialog editing mode SubclassWin(m_hWnd); @@ -137,15 +168,25 @@ wxSize wxStaticBitmap::DoGetBestSize() const return wxWindow::DoGetBestSize(); } -void wxStaticBitmap::SetImage(const wxGDIImage& bitmap) +void wxStaticBitmap::SetImage(const wxGDIImage* image) { Free(); - m_isIcon = bitmap.IsKindOf(CLASSINFO(wxIcon)); + const wxIcon *icon = wxDynamicCast(image, wxIcon); + m_isIcon = icon != NULL; if ( m_isIcon ) - m_image = new wxIcon((const wxIcon&)bitmap); + { + m_image = new wxIcon(*icon); + } else - m_image = new wxBitmap((const wxBitmap &)bitmap); + { + wxASSERT_MSG( wxDynamicCast(image, wxBitmap), + _T("not an icon and not a bitmap?") ); + + const wxBitmap *bitmap = (wxBitmap *)image; + + m_image = new wxBitmap(*bitmap); + } int x, y; int w, h; @@ -160,8 +201,8 @@ void wxStaticBitmap::SetImage(const wxGDIImage& bitmap) if ( ImageIsOk() ) { - int width = bitmap.GetWidth(), - height = bitmap.GetHeight(); + int width = image->GetWidth(), + height = image->GetHeight(); if ( width && height ) { w = width; @@ -216,7 +257,9 @@ bool wxStaticBitmap::MSWOnDraw(WXDRAWITEMSTRUCT *item) return TRUE; } +#endif // Win16 +// We need this or the control can never be moved e.g. in Dialog Editor. long wxStaticBitmap::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) @@ -228,4 +271,5 @@ long wxStaticBitmap::MSWWindowProc(WXUINT nMsg, return wxWindow::MSWWindowProc(nMsg, wParam, lParam); } -#endif // Win16 + +#endif // wxUSE_STATBMP