From a73a4ab75eca4329d88093ad143121e0b96a8006 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 6 Jan 2008 00:51:38 +0000 Subject: [PATCH] draw the bitmap manually under Win9x and 2000 because they don't support alpha transparency (but wxDC::DrawBitmap() does) (modified patch 1761598) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51031 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/statbmp.h | 5 +++++ src/msw/statbmp.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/wx/msw/statbmp.h b/include/wx/msw/statbmp.h index ba61d269ef..f510de3a3f 100644 --- a/include/wx/msw/statbmp.h +++ b/include/wx/msw/statbmp.h @@ -70,6 +70,11 @@ protected: void SetImage(const wxGDIImage* image); void SetImageNoCopy( wxGDIImage* image ); + // draw the bitmap ourselves here if the OS can't do it correctly (if it + // can we leave it to it) + void DoPaintManually(wxPaintEvent& event); + + // we can have either an icon or a bitmap bool m_isIcon; wxGDIImage *m_image; diff --git a/src/msw/statbmp.cpp b/src/msw/statbmp.cpp index 537c193d84..511fb26ff7 100644 --- a/src/msw/statbmp.cpp +++ b/src/msw/statbmp.cpp @@ -168,6 +168,14 @@ bool wxStaticBitmap::Create(wxWindow *parent, // GetBestSize will work properly now, so set the best size if needed SetInitialSize(size); + // 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)); + } + return true; } @@ -240,6 +248,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 ); -- 2.45.2