wxSize wxStaticBitmap::DoGetBestSize() const { if ( ImageIsOk() ) { wxSize best(m_image->GetWidth(), m_image->GetHeight()); CacheBestSize(best); return best; } // this is completely arbitrary return wxSize(16, 16); }
void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image) { Free(); InvalidateBestSize(); m_isIcon = image->IsKindOf( wxCLASSINFO(wxIcon) ); // the image has already been copied m_image = image; int x, y; int w, h; GetPosition(&x, &y); GetSize(&w, &h); #ifdef __WIN32__ HANDLE handle = (HANDLE)m_image->GetHandle(); LONG style = ::GetWindowLong( (HWND)GetHWND(), GWL_STYLE ) ; ::SetWindowLong( (HWND)GetHWND(), GWL_STYLE, ( style & ~( SS_BITMAP|SS_ICON ) ) | ( m_isIcon ? SS_ICON : SS_BITMAP ) ); HGDIOBJ oldHandle = (HGDIOBJ)::SendMessage(GetHwnd(), STM_SETIMAGE, 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() ) { int width = image->GetWidth(), height = image->GetHeight(); if ( width && height ) { w = width; h = height; ::MoveWindow(GetHwnd(), x, y, width, height, FALSE); } } RECT rect; rect.left = x; rect.top = y; rect.right = x + w; rect.bottom = y + h; ::InvalidateRect(GetHwndOf(GetParent()), &rect, TRUE); }
wxSize wxStaticBitmap::DoGetBestClientSize() const { wxSize size; if ( ImageIsOk() ) { size = m_image->GetSize(); } else // No image yet { // this is completely arbitrary size.x = size.y = 16; } return size; }
void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image) { Free(); InvalidateBestSize(); m_isIcon = image->IsKindOf( wxCLASSINFO(wxIcon) ); // the image has already been copied m_image = image; int x, y; int w, h; GetPosition(&x, &y); GetSize(&w, &h); // Normally we just use the handle of provided image but in some cases we // create our own temporary bitmap, so the actual handle may end up being // different from the original one. const HANDLE handleOrig = (HANDLE)m_image->GetHandle(); HANDLE handle = handleOrig; #if wxUSE_WXDIB if ( !m_isIcon ) { // wxBitmap normally stores alpha in pre-multiplied format but // apparently STM_SETIMAGE message handler does pre-multiplication // internally so we need to undo the pre-multiplication here for a // while (this is similar to what we do in ImageList::Add()). const wxBitmap& bmp = static_cast<wxBitmap&>(*image); if ( bmp.HasAlpha() ) { // For bitmap with alpha channel create temporary DIB with // not-premultiplied alpha values. handle = wxDIB(bmp.ConvertToImage(), wxDIB::PixelFormat_NotPreMultiplied).Detach(); } } #endif // wxUSE_WXDIB LONG style = ::GetWindowLong( (HWND)GetHWND(), GWL_STYLE ) ; ::SetWindowLong( (HWND)GetHWND(), GWL_STYLE, ( style & ~( SS_BITMAP|SS_ICON ) ) | ( m_isIcon ? SS_ICON : SS_BITMAP ) ); MSWReplaceImageHandle((WXLPARAM)handle); DeleteCurrentHandleIfNeeded(); m_currentHandle = (WXHANDLE)handle; m_ownsCurrentHandle = handle != handleOrig; if ( ImageIsOk() ) { int width = image->GetWidth(), height = image->GetHeight(); if ( width && height ) { w = width; h = height; ::MoveWindow(GetHwnd(), x, y, width, height, FALSE); } } RECT rect; rect.left = x; rect.top = y; rect.right = x + w; rect.bottom = y + h; ::InvalidateRect(GetHwndOf(GetParent()), &rect, TRUE); }