]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/statbmp.cpp
signed/unsigned comparison warning (and probably even error) fixed
[wxWidgets.git] / src / os2 / statbmp.cpp
index 5d674c3826c501aacb492e2f91ddbbf6cc668c06..5d523be4ffd9fb8f72fc31d458580724b3acee00 100644 (file)
@@ -9,6 +9,10 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
+#ifdef __GNUG__
+#pragma implementation "statbmp.h"
+#endif
+
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 
 IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
 
+static wxGDIImage* ConvertImage(
+  const wxGDIImage&                 rBitmap
+)
+{
+    bool                            bIsIcon = rBitmap.IsKindOf( CLASSINFO(wxIcon) );
+
+    if(!bIsIcon )
+    {
+        wxASSERT_MSG( wxDynamicCast(&rBitmap, wxBitmap),
+                      _T("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
 // ---------------------------------------------------------------------------
@@ -42,15 +74,15 @@ bool wxStaticBitmap::Create(
 , 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
@@ -62,18 +94,21 @@ bool wxStaticBitmap::Create(
     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;
 
+    sprintf(zId, "#%d", rBitmap.GetId());
     m_hWnd = (WXHWND)::WinCreateWindow( pParent->GetHWND()
-                                       ,zClassname
-                                       ,wxT("")
+                                       ,WC_STATIC
+                                       ,zId
                                        ,nWinstyle | WS_VISIBLE
                                        ,0,0,0,0
                                        ,pParent->GetHWND()
@@ -82,17 +117,20 @@ bool wxStaticBitmap::Create(
                                        ,NULL
                                        ,NULL
                                       );
-
+    if (!m_hWnd)
+    {
+        vError = ::WinGetLastError(wxGetInstance());
+        sError = wxPMErrorToStr(vError);
+        return FALSE;
+    }
     wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") );
-
-    SetImage(rBitmap);
+    m_pImage = ConvertImage(rBitmap);
+    m_pImage->SetHandle((WXHWND)::WinSendMsg(m_hWnd, SM_QUERYHANDLE, (MPARAM)0, (MPARAM)0));
 
     // Subclass again for purposes of dialog editing mode
     SubclassWin(m_hWnd);
-    SetFont(GetParent()->GetFont());
-    SetSize(nX, nY, nWidth, nHeight);
-    return(FALSE);
-}
+    return(TRUE);
+} // end of wxStaticBitmap::Create
 
 bool wxStaticBitmap::ImageIsOk() const
 {
@@ -101,14 +139,17 @@ bool wxStaticBitmap::ImageIsOk() const
 
 void wxStaticBitmap::Free()
 {
-    delete m_pImage;
+    if (m_pImage)
+        delete m_pImage;
     m_pImage = NULL;
-}
+} // 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();
 }
 
@@ -116,55 +157,37 @@ void wxStaticBitmap::SetImage(
   const wxGDIImage&                 rBitmap
 )
 {
-    Free();
-
-    m_bIsIcon = rBitmap.IsKindOf(CLASSINFO(wxIcon));
-    if (m_bIsIcon)
-        m_pImage = new wxIcon((const wxIcon&)rBitmap);
-    else
-        m_pImage = new wxBitmap((const wxBitmap &)rBitmap);
-
-    int                             nX;
-    int                             nY;
-    int                             nW;
-    int                             nH;
-
-    GetPosition(&nX, &nY);
-    GetSize(&nW, &nH);
+    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);
 
     RECTL                           vRect;
 
-    vRect.xLeft   = nW;
+    vRect.xLeft   = nX;
     vRect.yTop    = nY;
-    vRect.xRight  = nX + nW;
-    vRect.yBottom = nY + nH;
+    vRect.xRight  = nX + nWidth;
+    vRect.yBottom = nY + nHeight;
 
     ::WinInvalidateRect(GetHwndOf(GetParent()), &vRect, TRUE);
 }
 
+MRESULT wxStaticBitmap::OS2WindowProc(
+  WXUINT                            uMsg
+, WXWPARAM                          wParam
+, WXLPARAM                          lParam
+)
+{
+    return wxWindow::OS2WindowProc(uMsg, wParam, lParam);
+} // end of wxStaticBitmap::OS2WindowProc