home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / src / os2 / statbmp.cpp < prev    next >
C/C++ Source or Header  |  2002-09-03  |  7KB  |  223 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        statbmp.cpp
  3. // Purpose:     wxStaticBitmap
  4. // Author:      David Webster
  5. // Modified by:
  6. // Created:     11/27/99
  7. // RCS-ID:      $Id: STATBMP.CPP,v 1.14 2002/09/03 04:47:39 DW Exp $
  8. // Copyright:   (c) David Webster
  9. // Licence:     wxWindows licence
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. #ifdef __GNUG__
  13. #pragma implementation "statbmp.h"
  14. #endif
  15.  
  16. // For compilers that support precompilation, includes "wx.h".
  17. #include "wx/wxprec.h"
  18.  
  19. #include "wx/window.h"
  20. #include "wx/os2/private.h"
  21.  
  22. #ifndef WX_PRECOMP
  23.     #include "wx/icon.h"
  24.     #include "wx/statbmp.h"
  25. #endif
  26.  
  27. #include <stdio.h>
  28.  
  29. // ---------------------------------------------------------------------------
  30. // macors
  31. // ---------------------------------------------------------------------------
  32.  
  33. IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
  34.  
  35. BEGIN_EVENT_TABLE(wxStaticBitmap, wxWindow)
  36.     EVT_PAINT(wxStaticBitmap::OnPaint)
  37. END_EVENT_TABLE()
  38.  
  39. static wxGDIImage* ConvertImage(
  40.   const wxGDIImage&                 rBitmap
  41. )
  42. {
  43.     bool                            bIsIcon = rBitmap.IsKindOf( CLASSINFO(wxIcon) );
  44.  
  45.     if(!bIsIcon )
  46.     {
  47.         wxASSERT_MSG( wxDynamicCast(&rBitmap, wxBitmap),
  48.                       _T("not an icon and not a bitmap?") );
  49.  
  50.         const wxBitmap&             rBmp = (const wxBitmap&)rBitmap;
  51.         wxMask*                     pMask = rBmp.GetMask();
  52.  
  53.         if (pMask && pMask->GetMaskBitmap())
  54.         {
  55.             wxIcon*                 pIcon = new wxIcon;
  56.  
  57.             pIcon->CopyFromBitmap(rBmp);
  58.             return pIcon;
  59.         }
  60.         return new wxBitmap(rBmp);
  61.     }
  62.  
  63.     // copying a bitmap is a cheap operation
  64.     return new wxIcon( (const wxIcon&)rBitmap );
  65. } // end of ConvertImage
  66.  
  67. // ---------------------------------------------------------------------------
  68. //  wxStaticBitmap
  69. // ---------------------------------------------------------------------------
  70.  
  71. bool wxStaticBitmap::Create(
  72.   wxWindow*                         pParent
  73. , wxWindowID                        nId
  74. , const wxGDIImage&                 rBitmap
  75. , const wxPoint&                    rPos
  76. , const wxSize&                     rSize
  77. , long                              lStyle
  78. , const wxString&                   rName
  79. )
  80. {
  81.     ERRORID                         vError;
  82.     wxString                        sError;
  83.  
  84.     Init();
  85.  
  86.     SetName(rName);
  87.     if (pParent)
  88.         pParent->AddChild(this);
  89.  
  90.     if (nId == -1)
  91.         m_windowId = (int)NewControlId();
  92.     else
  93.         m_windowId = nId;
  94.  
  95.     m_windowStyle = lStyle;
  96.  
  97.     int                             nX= rPos.x;
  98.     int                             nY = rPos.y;
  99.     int                             nWidth = rSize.x;
  100.     int                             nHeight = rSize.y;
  101.     char                            zId[16];
  102.  
  103.     m_windowStyle = lStyle;
  104.  
  105.     m_bIsIcon = rBitmap.IsKindOf(CLASSINFO(wxIcon));
  106.  
  107.     //
  108.     // For now we only support an ICON
  109.     //
  110.     int                             nWinstyle = SS_ICON;
  111.  
  112.     m_hWnd = (WXHWND)::WinCreateWindow( pParent->GetHWND()
  113.                                        ,wxCanvasClassName
  114.                                        ,zId
  115.                                        ,nWinstyle | WS_VISIBLE
  116.                                        ,0,0,0,0
  117.                                        ,pParent->GetHWND()
  118.                                        ,HWND_TOP
  119.                                        ,m_windowId
  120.                                        ,NULL
  121.                                        ,NULL
  122.                                       );
  123.     if (!m_hWnd)
  124.     {
  125.         vError = ::WinGetLastError(wxGetInstance());
  126.         sError = wxPMErrorToStr(vError);
  127.         return FALSE;
  128.     }
  129.     wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") );
  130.     m_pImage = ConvertImage(rBitmap);
  131.     m_pImage->SetHandle((WXHWND)::WinSendMsg(m_hWnd, SM_QUERYHANDLE, (MPARAM)0, (MPARAM)0));
  132.  
  133.     // Subclass again for purposes of dialog editing mode
  134.     SubclassWin(m_hWnd);
  135.     SetSize(nX, nY, m_pImage->GetWidth(), m_pImage->GetHeight());
  136.  
  137.     return(TRUE);
  138. } // end of wxStaticBitmap::Create
  139.  
  140. bool wxStaticBitmap::ImageIsOk() const
  141. {
  142.     return(m_pImage && m_pImage->Ok());
  143. }
  144.  
  145. void wxStaticBitmap::Free()
  146. {
  147.     if (m_pImage)
  148.         delete m_pImage;
  149.     m_pImage = NULL;
  150. } // end of wxStaticBitmap::Free
  151.  
  152. wxSize wxStaticBitmap::DoGetBestSize() const
  153. {
  154.     //
  155.     // Reuse the current size (as wxWindow does) instead of using some
  156.     // arbitrary default size (as wxControl, our immediate base class, does)
  157.     //
  158.     return wxWindow::DoGetBestSize();
  159. }
  160.  
  161. void wxStaticBitmap::OnPaint (
  162.   wxPaintEvent&                     WXUNUSED(rEvent)
  163. )
  164. {
  165.     wxPaintDC                       vDc(this);
  166.     int                             i;
  167.     wxBitmap*                       pBitmap;
  168.  
  169.     if (m_pImage->IsKindOf(CLASSINFO(wxIcon)))
  170.     {
  171.         wxIcon*                     pIcon;
  172.  
  173.         pIcon = wxDynamicCast(m_pImage, wxIcon);
  174.         pBitmap = new wxBitmap(*pIcon);
  175.         vDc.DrawBitmap(*pBitmap, 0, 0);
  176.         delete pBitmap;
  177.     }
  178.     else
  179.     {
  180.         pBitmap = wxDynamicCast(m_pImage, wxBitmap);
  181.         vDc.DrawBitmap(*pBitmap, 0, 0);
  182.     }
  183. } // end of wxStaticBitmap::OnPaint
  184.  
  185. void wxStaticBitmap::SetImage(
  186.   const wxGDIImage&                 rBitmap
  187. )
  188. {
  189.     int                             nX = 0;
  190.     int                             nY = 0;
  191.     int                             nWidth = 0;
  192.     int                             nHeight = 0;
  193.  
  194.     Free();
  195.     ::WinSendMsg( GetHwnd()
  196.                  ,SM_SETHANDLE
  197.                  ,MPFROMHWND(rBitmap.GetHandle())
  198.                  ,NULL
  199.                 );
  200.     m_pImage = ConvertImage(rBitmap);
  201.  
  202.     GetPosition(&nX, &nY);
  203.     GetSize(&nWidth, &nHeight);
  204.  
  205.     RECTL                           vRect;
  206.  
  207.     vRect.xLeft   = nX;
  208.     vRect.yTop    = nY;
  209.     vRect.xRight  = nX + nWidth;
  210.     vRect.yBottom = nY + nHeight;
  211.  
  212.     ::WinInvalidateRect(GetHwndOf(GetParent()), &vRect, TRUE);
  213. }
  214.  
  215. MRESULT wxStaticBitmap::OS2WindowProc(
  216.   WXUINT                            uMsg
  217. , WXWPARAM                          wParam
  218. , WXLPARAM                          lParam
  219. )
  220. {
  221.     return wxWindow::OS2WindowProc(uMsg, wParam, lParam);
  222. } // end of wxStaticBitmap::OS2WindowProc
  223.