]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/statbmp.cpp
added a section about Connect(), improve/streamline the one about event tables
[wxWidgets.git] / src / msw / statbmp.cpp
index ca99580ab0c7cab4839ce06034890127cd604f7e..d504aeb2c6c958378e3c918394832bfdb19e084c 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        statbmp.cpp
+// Name:        src/msw/statbmp.cpp
 // Purpose:     wxStaticBitmap
 // Author:      Julian Smart
 // Modified by:
 // Purpose:     wxStaticBitmap
 // Author:      Julian Smart
 // Modified by:
 
 #if wxUSE_STATBMP
 
 
 #if wxUSE_STATBMP
 
-#include "wx/window.h"
-#include "wx/msw/private.h"
+#include "wx/statbmp.h"
 
 #ifndef WX_PRECOMP
 
 #ifndef WX_PRECOMP
+    #include "wx/window.h"
     #include "wx/icon.h"
     #include "wx/icon.h"
-    #include "wx/statbmp.h"
+    #include "wx/dcclient.h"
 #endif
 
 #endif
 
+#include "wx/msw/private.h"
+
 #include "wx/sysopt.h"
 
 #include <stdio.h>
 #include "wx/sysopt.h"
 
 #include <stdio.h>
@@ -165,14 +167,17 @@ bool wxStaticBitmap::Create(wxWindow *parent,
     SetImageNoCopy(image);
 
     // GetBestSize will work properly now, so set the best size if needed
     SetImageNoCopy(image);
 
     // GetBestSize will work properly now, so set the best size if needed
-    SetBestSize(size);
+    SetInitialSize(size);
 
 
-    return true;
-}
+    // Win9x and 2000 don't draw correctly the images with alpha channel so we
+    // need to draw them ourselves and it's easier to just always do it rather
+    // than check if we have an image with alpha or not
+    if ( wxGetWinVersion() <= wxWinVersion_2000 )
+    {
+        Connect(wxEVT_PAINT, wxPaintEventHandler(wxStaticBitmap::DoPaintManually));
+    }
 
 
-wxBorder wxStaticBitmap::GetDefaultBorder() const
-{
-    return wxBORDER_NONE;
+    return true;
 }
 
 WXDWORD wxStaticBitmap::MSWGetStyle(long style, WXDWORD *exstyle) const
 }
 
 WXDWORD wxStaticBitmap::MSWGetStyle(long style, WXDWORD *exstyle) const
@@ -244,6 +249,25 @@ wxSize wxStaticBitmap::DoGetBestSize() const
     return wxSize(16, 16);
 }
 
     return wxSize(16, 16);
 }
 
+void wxStaticBitmap::DoPaintManually(wxPaintEvent& WXUNUSED(event))
+{
+    wxPaintDC dc(this);
+
+    const wxSize size(GetSize());
+    const wxBitmap bmp(GetBitmap());
+
+    // Clear the background
+    dc.SetBrush(GetBackgroundColour());
+    dc.SetPen(*wxTRANSPARENT_PEN);
+    dc.DrawRectangle(0, 0, size.GetWidth(), size.GetHeight());
+
+    // Draw the image in the middle
+    dc.DrawBitmap(bmp,
+                  (size.GetWidth() - bmp.GetWidth()) / 2,
+                  (size.GetHeight() - bmp.GetHeight()) / 2,
+                  true /* use mask */);
+}
+
 void wxStaticBitmap::SetImage( const wxGDIImage* image )
 {
     wxGDIImage* convertedImage = ConvertImage( *image );
 void wxStaticBitmap::SetImage( const wxGDIImage* image )
 {
     wxGDIImage* convertedImage = ConvertImage( *image );
@@ -269,8 +293,16 @@ void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image)
     LONG style = ::GetWindowLong( (HWND)GetHWND(), GWL_STYLE ) ;
     ::SetWindowLong( (HWND)GetHWND(), GWL_STYLE, ( style & ~( SS_BITMAP|SS_ICON ) ) |
                      ( m_isIcon ? SS_ICON : SS_BITMAP ) );
     LONG style = ::GetWindowLong( (HWND)GetHWND(), GWL_STYLE ) ;
     ::SetWindowLong( (HWND)GetHWND(), GWL_STYLE, ( style & ~( SS_BITMAP|SS_ICON ) ) |
                      ( m_isIcon ? SS_ICON : SS_BITMAP ) );
-    ::SendMessage(GetHwnd(), STM_SETIMAGE,
+    HGDIOBJ oldHandle = (HGDIOBJ)::SendMessage(GetHwnd(), STM_SETIMAGE,
                   m_isIcon ? IMAGE_ICON : IMAGE_BITMAP, (LPARAM)handle);
                   m_isIcon ? IMAGE_ICON : IMAGE_BITMAP, (LPARAM)handle);
+    // detect if this is still the handle we passed before or
+    // if the static-control made a copy of the bitmap!
+    if (m_currentHandle != 0 && oldHandle != (HGDIOBJ) m_currentHandle)
+    {
+        // the static control made a copy and we are responsible for deleting it
+        DeleteObject((HGDIOBJ) oldHandle);
+    }
+    m_currentHandle = (WXHANDLE)handle;
 #endif // Win32
 
     if ( ImageIsOk() )
 #endif // Win32
 
     if ( ImageIsOk() )
@@ -295,4 +327,3 @@ void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image)
 }
 
 #endif // wxUSE_STATBMP
 }
 
 #endif // wxUSE_STATBMP
-