]> git.saurik.com Git - wxWidgets.git/blame - src/os2/statbmp.cpp
ICCCM says that the TIMESTAMP atom is required, so provide it. This is patch 1424755...
[wxWidgets.git] / src / os2 / statbmp.cpp
CommitLineData
0e320a79
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: statbmp.cpp
3// Purpose: wxStaticBitmap
409c9842 4// Author: David Webster
0e320a79 5// Modified by:
3b9e3455 6// Created: 11/27/99
0e320a79 7// RCS-ID: $Id$
409c9842 8// Copyright: (c) David Webster
65571936 9// Licence: wxWindows licence
0e320a79
DW
10/////////////////////////////////////////////////////////////////////////////
11
409c9842
DW
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
50528a1d 15#include "wx/dcclient.h"
409c9842
DW
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"
0e320a79
DW
22#endif
23
409c9842
DW
24#include <stdio.h>
25
26// ---------------------------------------------------------------------------
179db36d 27// macros
409c9842 28// ---------------------------------------------------------------------------
0e320a79 29
0e320a79 30IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
0e320a79 31
1de4baa3
DW
32BEGIN_EVENT_TABLE(wxStaticBitmap, wxWindow)
33 EVT_PAINT(wxStaticBitmap::OnPaint)
34END_EVENT_TABLE()
35
70a2c656
DW
36static 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
409c9842
DW
64// ---------------------------------------------------------------------------
65// wxStaticBitmap
66// ---------------------------------------------------------------------------
0e320a79 67
6670f564
WS
68bool 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 )
0e320a79 75{
70a2c656
DW
76 ERRORID vError;
77 wxString sError;
78
04701dd9
DW
79 Init();
80
3b9e3455 81 SetName(rName);
43543d98
DW
82 if (pParent)
83 pParent->AddChild(this);
0e320a79 84
43543d98 85 if (nId == -1)
409c9842 86 m_windowId = (int)NewControlId();
0e320a79 87 else
3b9e3455 88 m_windowId = nId;
0e320a79 89
3b9e3455 90 m_windowStyle = lStyle;
0e320a79 91
43543d98
DW
92 int nX= rPos.x;
93 int nY = rPos.y;
70a2c656 94 char zId[16];
04701dd9 95
3b9e3455 96 m_windowStyle = lStyle;
04701dd9 97
3b9e3455 98 m_bIsIcon = rBitmap.IsKindOf(CLASSINFO(wxIcon));
04701dd9 99
70a2c656
DW
100 //
101 // For now we only support an ICON
102 //
103 int nWinstyle = SS_ICON;
3b9e3455 104
43543d98 105 m_hWnd = (WXHWND)::WinCreateWindow( pParent->GetHWND()
0fba44b4 106 ,(PSZ)wxCanvasClassName
70a2c656 107 ,zId
3b9e3455
DW
108 ,nWinstyle | WS_VISIBLE
109 ,0,0,0,0
110 ,pParent->GetHWND()
111 ,HWND_TOP
112 ,m_windowId
113 ,NULL
114 ,NULL
115 );
70a2c656
DW
116 if (!m_hWnd)
117 {
118 vError = ::WinGetLastError(wxGetInstance());
119 sError = wxPMErrorToStr(vError);
6670f564 120 return false;
70a2c656 121 }
04701dd9 122 wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") );
70a2c656 123 m_pImage = ConvertImage(rBitmap);
179db36d
SN
124 ::WinSendMsg( m_hWnd,
125 SM_SETHANDLE,
126 MPFROMHWND(rBitmap.GetHandle()),
127 (MPARAM)0);
04701dd9
DW
128
129 // Subclass again for purposes of dialog editing mode
130 SubclassWin(m_hWnd);
1de4baa3
DW
131 SetSize(nX, nY, m_pImage->GetWidth(), m_pImage->GetHeight());
132
6670f564 133 return true;
70a2c656 134} // end of wxStaticBitmap::Create
0e320a79 135
409c9842 136bool wxStaticBitmap::ImageIsOk() const
0e320a79 137{
43543d98 138 return(m_pImage && m_pImage->Ok());
409c9842
DW
139}
140
141void wxStaticBitmap::Free()
142{
70a2c656
DW
143 if (m_pImage)
144 delete m_pImage;
3b9e3455 145 m_pImage = NULL;
70a2c656 146} // end of wxStaticBitmap::Free
409c9842 147
e78c4d50 148wxSize wxStaticBitmap::DoGetBestSize() const
409c9842 149{
70a2c656
DW
150 //
151 // Reuse the current size (as wxWindow does) instead of using some
409c9842 152 // arbitrary default size (as wxControl, our immediate base class, does)
70a2c656 153 //
409c9842 154 return wxWindow::DoGetBestSize();
0e320a79
DW
155}
156
1de4baa3
DW
157void wxStaticBitmap::OnPaint (
158 wxPaintEvent& WXUNUSED(rEvent)
159)
160{
161 wxPaintDC vDc(this);
1de4baa3
DW
162 wxBitmap* pBitmap;
163
164 if (m_pImage->IsKindOf(CLASSINFO(wxIcon)))
165 {
166 wxIcon* pIcon;
167
168 pIcon = wxDynamicCast(m_pImage, wxIcon);
169 pBitmap = new wxBitmap(*pIcon);
170 vDc.DrawBitmap(*pBitmap, 0, 0);
171 delete pBitmap;
172 }
173 else
174 {
175 pBitmap = wxDynamicCast(m_pImage, wxBitmap);
176 vDc.DrawBitmap(*pBitmap, 0, 0);
177 }
178} // end of wxStaticBitmap::OnPaint
179
3b9e3455
DW
180void wxStaticBitmap::SetImage(
181 const wxGDIImage& rBitmap
182)
0e320a79 183{
70a2c656
DW
184 int nX = 0;
185 int nY = 0;
186 int nWidth = 0;
187 int nHeight = 0;
3b9e3455 188
70a2c656 189 Free();
3b9e3455
DW
190 ::WinSendMsg( GetHwnd()
191 ,SM_SETHANDLE
70a2c656 192 ,MPFROMHWND(rBitmap.GetHandle())
3b9e3455
DW
193 ,NULL
194 );
70a2c656 195 m_pImage = ConvertImage(rBitmap);
3b9e3455 196
70a2c656
DW
197 GetPosition(&nX, &nY);
198 GetSize(&nWidth, &nHeight);
179db36d
SN
199 // Convert to OS/2 coordinate system
200 nY = wxWindow::GetOS2ParentHeight(GetParent()) - nY - nHeight;
3b9e3455
DW
201
202 RECTL vRect;
203
70a2c656 204 vRect.xLeft = nX;
179db36d 205 vRect.yTop = nY + nHeight;
70a2c656 206 vRect.xRight = nX + nWidth;
179db36d 207 vRect.yBottom = nY;
3b9e3455
DW
208
209 ::WinInvalidateRect(GetHwndOf(GetParent()), &vRect, TRUE);
0e320a79
DW
210}
211
32334453
DW
212MRESULT wxStaticBitmap::OS2WindowProc(
213 WXUINT uMsg
214, WXWPARAM wParam
215, WXLPARAM lParam
216)
217{
218 return wxWindow::OS2WindowProc(uMsg, wParam, lParam);
219} // end of wxStaticBitmap::OS2WindowProc