]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/statbmp.cpp
fix crash which happened if you called SetAttr(NULL) followed by SetAttr(attr) (...
[wxWidgets.git] / src / msw / statbmp.cpp
index c321fe5f73c680ad9b7c27fbffe178b9c2b30908..d504aeb2c6c958378e3c918394832bfdb19e084c 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        statbmp.cpp
+// Name:        src/msw/statbmp.cpp
 // Purpose:     wxStaticBitmap
 // Author:      Julian Smart
 // Modified by:
 
 #if wxUSE_STATBMP
 
-#include "wx/window.h"
-#include "wx/msw/private.h"
+#include "wx/statbmp.h"
 
 #ifndef WX_PRECOMP
+    #include "wx/window.h"
     #include "wx/icon.h"
-    #include "wx/statbmp.h"
+    #include "wx/dcclient.h"
 #endif
 
+#include "wx/msw/private.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
-    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
@@ -244,6 +249,25 @@ wxSize wxStaticBitmap::DoGetBestSize() const
     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 );
@@ -276,9 +300,9 @@ void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image)
     if (m_currentHandle != 0 && oldHandle != (HGDIOBJ) m_currentHandle)
     {
         // the static control made a copy and we are responsible for deleting it
-        DeleteObject((HGDIOBJ) oldHandle);      
+        DeleteObject((HGDIOBJ) oldHandle);
     }
-    m_currentHandle = (WXHANDLE)handle;                        
+    m_currentHandle = (WXHANDLE)handle;
 #endif // Win32
 
     if ( ImageIsOk() )
@@ -303,4 +327,3 @@ void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image)
 }
 
 #endif // wxUSE_STATBMP
-