X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e58dab20ce995856303154a367bcca904066525c..64ea838d8f4d1853b7d850db93ee565e901d099a:/src/os2/statbmp.cpp diff --git a/src/os2/statbmp.cpp b/src/os2/statbmp.cpp index d06a109a0e..9a7f0985a3 100644 --- a/src/os2/statbmp.cpp +++ b/src/os2/statbmp.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: statbmp.cpp +// Name: src/os2/statbmp.cpp // Purpose: wxStaticBitmap // Author: David Webster // Modified by: @@ -9,52 +9,78 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "statbmp.h" -#endif - // 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 // --------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl) +BEGIN_EVENT_TABLE(wxStaticBitmap, wxWindow) + EVT_PAINT(wxStaticBitmap::OnPaint) +END_EVENT_TABLE() + +static wxGDIImage* ConvertImage( + const wxGDIImage& rBitmap +) +{ + bool bIsIcon = rBitmap.IsKindOf( CLASSINFO(wxIcon) ); + + if(!bIsIcon ) + { + wxASSERT_MSG( wxDynamicCast(&rBitmap, wxBitmap), + wxT("not an icon and not a bitmap?") ); + + const wxBitmap& rBmp = (const wxBitmap&)rBitmap; + wxMask* pMask = rBmp.GetMask(); + + if (pMask && pMask->GetMaskBitmap()) + { + wxIcon* pIcon = new wxIcon; + + pIcon->CopyFromBitmap(rBmp); + return pIcon; + } + return new wxBitmap(rBmp); + } + + // copying a bitmap is a cheap operation + return new wxIcon( (const wxIcon&)rBitmap ); +} // end of ConvertImage // --------------------------------------------------------------------------- // wxStaticBitmap // --------------------------------------------------------------------------- -bool wxStaticBitmap::Create( - wxWindow* pParent -, wxWindowID nId -, const wxGDIImage& rBitmap -, const wxPoint& rPos -, const wxSize& rSize -, long lStyle -, const wxString& rName -) +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; + Init(); SetName(rName); if (pParent) pParent->AddChild(this); - m_backgroundColour = pParent->GetBackgroundColour() ; - m_foregroundColour = pParent->GetForegroundColour() ; - if (nId == -1) m_windowId = (int)NewControlId(); else @@ -64,20 +90,20 @@ bool wxStaticBitmap::Create( int nX= rPos.x; int nY = rPos.y; - int nWidth = rSize.x; - int nHeight = rSize.y; + char zId[16]; m_windowStyle = lStyle; m_bIsIcon = rBitmap.IsKindOf(CLASSINFO(wxIcon)); - // TODO: create static bitmap control - const wxChar* zClassname = wxT("WX_STATIC"); - int nWinstyle = m_bIsIcon ? SS_ICON : SS_BITMAP; + // + // For now we only support an ICON + // + int nWinstyle = SS_ICON; m_hWnd = (WXHWND)::WinCreateWindow( pParent->GetHWND() - ,zClassname - ,wxT("") + ,(PSZ)wxCanvasClassName + ,zId ,nWinstyle | WS_VISIBLE ,0,0,0,0 ,pParent->GetHWND() @@ -86,88 +112,92 @@ bool wxStaticBitmap::Create( ,NULL ,NULL ); - - wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") ); - - SetImage(rBitmap); + 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); - SetFont(*wxSMALL_FONT); - SetSize(nX, nY, nWidth, nHeight); - return(FALSE); -} + SetSize(nX, nY, m_pImage->GetWidth(), m_pImage->GetHeight()); + + return true; +} // end of wxStaticBitmap::Create bool wxStaticBitmap::ImageIsOk() const { - return(m_pImage && m_pImage->Ok()); + return(m_pImage && m_pImage->IsOk()); } void wxStaticBitmap::Free() { - delete m_pImage; - m_pImage = NULL; -} + wxDELETE(m_pImage); +} // end of wxStaticBitmap::Free 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::SetImage( - const wxGDIImage& rBitmap -) +void wxStaticBitmap::OnPaint ( wxPaintEvent& WXUNUSED(rEvent) ) { - Free(); + wxPaintDC vDc(this); + wxBitmap* pBitmap; - m_bIsIcon = rBitmap.IsKindOf(CLASSINFO(wxIcon)); - if (m_bIsIcon) - m_pImage = new wxIcon((const wxIcon&)rBitmap); - else - m_pImage = new wxBitmap((const wxBitmap &)rBitmap); + if (m_pImage->IsKindOf(CLASSINFO(wxIcon))) + { + wxIcon* pIcon; - int nX; - int nY; - int nW; - int nH; + pIcon = wxDynamicCast(m_pImage, wxIcon); + pBitmap = new wxBitmap(*pIcon); + vDc.DrawBitmap(*pBitmap, 0, 0); + delete pBitmap; + } + else + { + pBitmap = wxDynamicCast(m_pImage, wxBitmap); + vDc.DrawBitmap(*pBitmap, 0, 0); + } +} // end of wxStaticBitmap::OnPaint - GetPosition(&nX, &nY); - GetSize(&nW, &nH); +void wxStaticBitmap::SetImage( const wxGDIImage& rBitmap ) +{ + int nX = 0; + int nY = 0; + int nWidth = 0; + int nHeight = 0; + Free(); ::WinSendMsg( GetHwnd() ,SM_SETHANDLE - ,MPFROMHWND(m_pImage->GetHandle()) + ,MPFROMHWND(rBitmap.GetHandle()) ,NULL ); - if (ImageIsOk()) - { - int nWidth = rBitmap.GetWidth(); - int nHeight = rBitmap.GetHeight(); + m_pImage = ConvertImage(rBitmap); - if (nWidth && nHeight) - { - nW = nWidth; - nW = nHeight; - - ::WinSetWindowPos( GetHwnd() - ,HWND_TOP - ,nX - ,nY - ,nWidth - ,nHeight - ,SWP_SIZE | SWP_MOVE | SWP_SHOW - ); - } - } + GetPosition(&nX, &nY); + GetSize(&nWidth, &nHeight); + // Convert to OS/2 coordinate system + nY = wxWindow::GetOS2ParentHeight(GetParent()) - nY - nHeight; RECTL vRect; - vRect.xLeft = nW; - vRect.yTop = nY; - vRect.xRight = nX + nW; - vRect.yBottom = nY + nH; + vRect.xLeft = nX; + vRect.yTop = nY + nHeight; + vRect.xRight = nX + nWidth; + vRect.yBottom = nY; ::WinInvalidateRect(GetHwndOf(GetParent()), &vRect, TRUE); }