X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/04701dd94f691292563a1f0eb19933819b1c5fe9..9eddec696f06d65a80e7339b2fae14fcb55f8383:/src/os2/statbmp.cpp?ds=sidebyside diff --git a/src/os2/statbmp.cpp b/src/os2/statbmp.cpp index 8a6baa82ee..dd3aff2163 100644 --- a/src/os2/statbmp.cpp +++ b/src/os2/statbmp.cpp @@ -1,9 +1,9 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: statbmp.cpp +// Name: src/os2/statbmp.cpp // Purpose: wxStaticBitmap // Author: David Webster // Modified by: -// Created: ??/??/98 +// Created: 11/27/99 // RCS-ID: $Id$ // Copyright: (c) David Webster // Licence: wxWindows licence @@ -12,117 +12,205 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/window.h" -#include "wx/os2/private.h" +#include "wx/statbmp.h" #ifndef WX_PRECOMP #include "wx/icon.h" - #include "wx/statbmp.h" + #include "wx/window.h" + #include "wx/dcclient.h" #endif +#include "wx/os2/private.h" + #include // --------------------------------------------------------------------------- -// macors +// macros // --------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl) -#endif -// --------------------------------------------------------------------------- -// wxStaticBitmap -// --------------------------------------------------------------------------- +BEGIN_EVENT_TABLE(wxStaticBitmap, wxWindow) + EVT_PAINT(wxStaticBitmap::OnPaint) +END_EVENT_TABLE() -bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, - const wxBitmap& bitmap, - const wxPoint& pos, - const wxSize& size, - long style, - const wxString& name) +static wxGDIImage* ConvertImage( + const wxGDIImage& rBitmap +) { - Init(); + bool bIsIcon = rBitmap.IsKindOf( CLASSINFO(wxIcon) ); - SetName(name); - if (parent) parent->AddChild(this); + if(!bIsIcon ) + { + wxASSERT_MSG( wxDynamicCast(&rBitmap, wxBitmap), + _T("not an icon and not a bitmap?") ); - m_backgroundColour = parent->GetBackgroundColour() ; - m_foregroundColour = parent->GetForegroundColour() ; + const wxBitmap& rBmp = (const wxBitmap&)rBitmap; + wxMask* pMask = rBmp.GetMask(); - if ( id == -1 ) - m_windowId = (int)NewControlId(); - else - m_windowId = id; + if (pMask && pMask->GetMaskBitmap()) + { + wxIcon* pIcon = new wxIcon; - m_windowStyle = style; + pIcon->CopyFromBitmap(rBmp); + return pIcon; + } + return new wxBitmap(rBmp); + } - int x = pos.x; - int y = pos.y; - int width = size.x; - int height = size.y; + // copying a bitmap is a cheap operation + return new wxIcon( (const wxIcon&)rBitmap ); +} // end of ConvertImage - m_windowStyle = style; +// --------------------------------------------------------------------------- +// wxStaticBitmap +// --------------------------------------------------------------------------- - m_isIcon = bitmap.IsKindOf(CLASSINFO(wxIcon)); +bool wxStaticBitmap::Create( wxWindow* pParent, + wxWindowID nId, + const wxGDIImage& rBitmap, + const wxPoint& rPos, + const wxSize& WXUNUSED(rSize), + long lStyle, + const wxString& rName ) +{ + ERRORID vError; + wxString sError; - // TODO: create static bitmap control - wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") ); + Init(); - SetBitmap(bitmap); + SetName(rName); + if (pParent) + pParent->AddChild(this); + + if (nId == -1) + m_windowId = (int)NewControlId(); + else + m_windowId = nId; + + m_windowStyle = lStyle; + + int nX= rPos.x; + int nY = rPos.y; + char zId[16]; + + m_windowStyle = lStyle; + + m_bIsIcon = rBitmap.IsKindOf(CLASSINFO(wxIcon)); + + // + // For now we only support an ICON + // + int nWinstyle = SS_ICON; + + m_hWnd = (WXHWND)::WinCreateWindow( pParent->GetHWND() + ,(PSZ)wxCanvasClassName + ,zId + ,nWinstyle | WS_VISIBLE + ,0,0,0,0 + ,pParent->GetHWND() + ,HWND_TOP + ,m_windowId + ,NULL + ,NULL + ); + if (!m_hWnd) + { + vError = ::WinGetLastError(wxGetInstance()); + sError = wxPMErrorToStr(vError); + return false; + } + wxCHECK_MSG( m_hWnd, false, wxT("Failed to create static bitmap") ); + m_pImage = ConvertImage(rBitmap); + ::WinSendMsg( m_hWnd, + SM_SETHANDLE, + MPFROMHWND(rBitmap.GetHandle()), + (MPARAM)0); // Subclass again for purposes of dialog editing mode SubclassWin(m_hWnd); + SetSize(nX, nY, m_pImage->GetWidth(), m_pImage->GetHeight()); - SetFont(GetParent()->GetFont()); - - SetSize(x, y, width, height); - - return FALSE; -} + return true; +} // end of wxStaticBitmap::Create bool wxStaticBitmap::ImageIsOk() const { - if ( m_isIcon && m_image.icon ) - return m_image.icon->Ok(); - else if ( m_image.bitmap ) - return m_image.bitmap->Ok(); - else - return FALSE; + return(m_pImage && m_pImage->Ok()); } void wxStaticBitmap::Free() { - if ( m_isIcon ) - delete m_image.icon; - else - delete m_image.bitmap; + if (m_pImage) + delete m_pImage; + m_pImage = NULL; +} // end of wxStaticBitmap::Free - m_image.icon = NULL; -} - -wxSize wxStaticBitmap::DoGetBestSize() +wxSize wxStaticBitmap::DoGetBestSize() const { - // reuse the current size (as wxWindow does) instead of using some + // + // Reuse the current size (as wxWindow does) instead of using some // arbitrary default size (as wxControl, our immediate base class, does) + // return wxWindow::DoGetBestSize(); } -void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap) +void wxStaticBitmap::OnPaint ( wxPaintEvent& WXUNUSED(rEvent) ) { - Free(); - - m_isIcon = bitmap.IsKindOf(CLASSINFO(wxIcon)); - if ( m_isIcon ) - m_image.icon = new wxIcon((const wxIcon&)bitmap); + wxPaintDC vDc(this); + wxBitmap* pBitmap; + + if (m_pImage->IsKindOf(CLASSINFO(wxIcon))) + { + wxIcon* pIcon; + + pIcon = wxDynamicCast(m_pImage, wxIcon); + pBitmap = new wxBitmap(*pIcon); + vDc.DrawBitmap(*pBitmap, 0, 0); + delete pBitmap; + } else - m_image.bitmap = new wxBitmap(bitmap); + { + pBitmap = wxDynamicCast(m_pImage, wxBitmap); + vDc.DrawBitmap(*pBitmap, 0, 0); + } +} // end of wxStaticBitmap::OnPaint - int x, y; - int w, h; - GetPosition(&x, &y); - GetSize(&w, &h); +void wxStaticBitmap::SetImage( const wxGDIImage& rBitmap ) +{ + int nX = 0; + int nY = 0; + int nWidth = 0; + int nHeight = 0; - // TODO: redraw bitmap + Free(); + ::WinSendMsg( GetHwnd() + ,SM_SETHANDLE + ,MPFROMHWND(rBitmap.GetHandle()) + ,NULL + ); + m_pImage = ConvertImage(rBitmap); + + GetPosition(&nX, &nY); + GetSize(&nWidth, &nHeight); + // Convert to OS/2 coordinate system + nY = wxWindow::GetOS2ParentHeight(GetParent()) - nY - nHeight; + + RECTL vRect; + + vRect.xLeft = nX; + vRect.yTop = nY + nHeight; + vRect.xRight = nX + nWidth; + vRect.yBottom = nY; + + ::WinInvalidateRect(GetHwndOf(GetParent()), &vRect, TRUE); } - +MRESULT wxStaticBitmap::OS2WindowProc( + WXUINT uMsg +, WXWPARAM wParam +, WXLPARAM lParam +) +{ + return wxWindow::OS2WindowProc(uMsg, wParam, lParam); +} // end of wxStaticBitmap::OS2WindowProc