- m_messageBitmap = bitmap;
-
- int x, y;
- int w, h;
- GetPosition(&x, &y);
- GetSize(&w, &h);
- RECT rect;
- rect.left = x; rect.top = y; rect.right = x + w; rect.bottom = y + h;
-
- if ( bitmap.Ok() )
- MoveWindow((HWND) GetHWND(), x, y, bitmap.GetWidth(), bitmap.GetHeight(),
- FALSE);
-
- InvalidateRect((HWND) GetParent()->GetHWND(), &rect, TRUE);
+ if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) )
+ return false;
+
+ // 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
+ m_isIcon = bitmap.IsKindOf(wxCLASSINFO(wxIcon));
+
+ wxGDIImage *image = ConvertImage( bitmap );
+ m_isIcon = image->IsKindOf( wxCLASSINFO(wxIcon) );
+
+ // create the native control
+ if ( !MSWCreateControl(wxT("STATIC"), wxEmptyString, pos, size) )
+ {
+ // control creation failed
+ return false;
+ }
+
+ // no need to delete the new image
+ SetImageNoCopy(image);
+
+ // GetBestSize will work properly now, so set the best size if needed
+ SetInitialSize(size);
+
+ // painting manually is reported not to work under Windows CE (see #10093),
+ // so don't do it there even if this probably means that alpha is not
+ // supported there -- but at least bitmaps without alpha appear correctly
+#ifndef __WXWINCE__
+ // Windows versions before XP (and even XP if the application has no
+ // manifest and so the old comctl32.dll is used) 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 ( wxTheApp->GetComCtl32Version() < 600 )
+ {
+ Connect(wxEVT_PAINT, wxPaintEventHandler(wxStaticBitmap::DoPaintManually));
+ }
+#endif // !__WXWINCE__
+
+ return true;