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