]> git.saurik.com Git - wxWidgets.git/blame - src/os2/bmpbuttn.cpp
take const wxWindow * in wxUxThemeHandle ctor
[wxWidgets.git] / src / os2 / bmpbuttn.cpp
CommitLineData
0e320a79 1/////////////////////////////////////////////////////////////////////////////
910b0053 2// Name: src/os2/bmpbuttn.cpp
0e320a79 3// Purpose: wxBitmapButton
37f214d5 4// Author: David Webster
0e320a79 5// Modified by:
37f214d5 6// Created: 10/13/99
0e320a79 7// RCS-ID: $Id$
37f214d5 8// Copyright: (c) David Webster
65571936 9// Licence: wxWindows licence
0e320a79
DW
10/////////////////////////////////////////////////////////////////////////////
11
37f214d5
DW
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
0e320a79 14
db16e5c3
DW
15#if wxUSE_BMPBUTTON
16
0e320a79 17#include "wx/bmpbuttn.h"
910b0053
WS
18
19#ifndef WX_PRECOMP
37f214d5
DW
20#endif
21
22#include "wx/os2/private.h"
23
0e320a79 24
0e320a79 25IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
0e320a79 26
37f214d5
DW
27#define BUTTON_HEIGHT_FACTOR (EDIT_CONTROL_FACTOR * 1.1)
28
6670f564
WS
29bool wxBitmapButton::Create( wxWindow* pParent,
30 wxWindowID vId,
31 const wxBitmap& rBitmap,
32 const wxPoint& rPos,
33 const wxSize& rSize,
34 long lStyle,
35 const wxValidator& rValidator,
36 const wxString& rsName )
0e320a79 37{
db16e5c3
DW
38 m_bmpNormal = rBitmap;
39 SetName(rsName);
5d4b632b 40#if wxUSE_VALIDATORS
db16e5c3 41 SetValidator(rValidator);
5d4b632b 42#endif
37f214d5 43
db16e5c3 44 pParent->AddChild(this);
0e320a79 45
db16e5c3
DW
46 m_backgroundColour = pParent->GetBackgroundColour() ;
47 m_foregroundColour = pParent->GetForegroundColour() ;
48 m_windowStyle = lStyle;
0e320a79 49
db16e5c3 50 if (lStyle & wxBU_AUTODRAW)
37f214d5
DW
51 {
52 m_marginX = wxDEFAULT_BUTTON_MARGIN;
53 m_marginY = wxDEFAULT_BUTTON_MARGIN;
54 }
55
910b0053
WS
56 int nX = rPos.x;
57 int nY = rPos.y;
58 int nWidth = rSize.x;
59 int nHeight = rSize.y;
0e320a79 60
910b0053 61 if (vId == wxID_ANY)
0e320a79
DW
62 m_windowId = NewControlId();
63 else
db16e5c3
DW
64 m_windowId = vId;
65
910b0053 66 if (nWidth == wxDefaultCoord && rBitmap.Ok())
a5799260 67 nWidth = rBitmap.GetWidth() + 4 * m_marginX;
db16e5c3 68
910b0053 69 if (nHeight == wxDefaultCoord && rBitmap.Ok())
a5799260 70 nHeight = rBitmap.GetHeight() + 4 * m_marginY;
db16e5c3
DW
71
72 ULONG ulOS2Style = WS_VISIBLE | WS_TABSTOP | BS_USERBUTTON;
73
74 if (m_windowStyle & wxCLIP_SIBLINGS)
75 ulOS2Style |= WS_CLIPSIBLINGS;
76
77 m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent)
78 ,WC_BUTTON
0fba44b4 79 ,(PSZ)wxEmptyString
db16e5c3
DW
80 ,ulOS2Style
81 ,0, 0, 0, 0
82 ,GetHwndOf(pParent)
83 ,HWND_TOP
84 ,m_windowId
85 ,NULL
86 ,NULL
87 );
88
89 //
90 //Subclass again for purposes of dialog editing mode
91 //
37f214d5 92 SubclassWin(m_hWnd);
db16e5c3
DW
93 SetFont(*wxSMALL_FONT);
94 SetSize( nX
95 ,nY
96 ,nWidth
97 ,nHeight
98 );
6670f564 99 return true;
db16e5c3 100} // end of wxBitmapButton::Create
37f214d5 101
6670f564 102bool wxBitmapButton::OS2OnDraw( WXDRAWITEMSTRUCT* pItem)
0e320a79 103{
910b0053
WS
104 PUSERBUTTON pUser = (PUSERBUTTON)pItem;
105 bool bAutoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
0e320a79 106
db16e5c3 107 if (!pUser)
910b0053 108 return false;
37f214d5 109
910b0053
WS
110 wxBitmap* pBitmap;
111 bool bIsSelected = pUser->fsState & BDS_HILITED;
112 wxClientDC vDc(this);
db16e5c3
DW
113
114 if (bIsSelected && m_bmpSelected.Ok())
115 pBitmap = &m_bmpSelected;
116 else if ((pUser->fsState & BDS_DEFAULT) && m_bmpFocus.Ok())
117 pBitmap = &m_bmpFocus;
118 else if ((pUser->fsState & BDS_DISABLED) && m_bmpDisabled.Ok())
119 pBitmap = &m_bmpDisabled;
120 else
121 pBitmap = &m_bmpNormal;
37f214d5 122
db16e5c3 123 if (!pBitmap->Ok() )
910b0053 124 return false;
37f214d5 125
37f214d5 126
db16e5c3 127 //
37f214d5 128 // Centre the bitmap in the control area
db16e5c3
DW
129 //
130 int nX = 0;
db16e5c3
DW
131 int nX1 = 0;
132 int nY1 = 0;
133 int nWidth = vDc.m_vRclPaint.xRight - vDc.m_vRclPaint.xLeft;
134 int nHeight = vDc.m_vRclPaint.xRight - vDc.m_vRclPaint.xLeft;
135 int nBmpWidth = pBitmap->GetWidth();
136 int nBmpHeight = pBitmap->GetHeight();
137
138 nX1 = nX + (nWidth - nBmpWidth) / 2;
139 nY1 = nX + (nHeight - nBmpHeight) / 2;
140
141 if (bIsSelected && bAutoDraw)
37f214d5 142 {
db16e5c3
DW
143 nX1++;
144 nY1++;
37f214d5
DW
145 }
146
db16e5c3
DW
147 //
148 // Draw the button face
149 //
150 {
151 DrawFace( vDc
152 ,bIsSelected
153 );
154 }
37f214d5 155
db16e5c3
DW
156 //
157 // Draw the bitmap
158 //
6670f564 159 vDc.DrawBitmap( *pBitmap, nX1, nY1, true );
db16e5c3
DW
160
161 //
162 // Draw focus / disabled state, if auto-drawing
163 //
164 if ((pUser->fsState == BDS_DISABLED) && bAutoDraw)
37f214d5 165 {
db16e5c3
DW
166 DrawButtonDisable( vDc
167 ,*pBitmap
168 );
37f214d5 169 }
db16e5c3 170 else if ((pUser->fsState == BDS_DEFAULT) && bAutoDraw)
37f214d5 171 {
db16e5c3 172 DrawButtonFocus(vDc);
37f214d5 173 }
6670f564 174 return true;
db16e5c3 175} // end of wxBitmapButton::OS2OnDraw
37f214d5 176
6670f564 177void wxBitmapButton::DrawFace (wxClientDC& rDC, bool bSel)
37f214d5 178{
db16e5c3
DW
179 //
180 // Set up drawing colors
181 //
6670f564
WS
182 wxPen vHiLitePen(*wxWHITE, 2, wxSOLID); // White
183 wxColour gray85(85, 85, 85);
184 wxPen vDarkShadowPen(gray85, 2, wxSOLID);
185 wxColour vFaceColor(204, 204, 204); // Light Grey
db16e5c3
DW
186
187 //
188 // Draw the main button face
189 //
190 ::WinFillRect(rDC.GetHPS(), &rDC.m_vRclPaint, vFaceColor.GetPixel());
191
192 //
193 // Draw the border
194 //
195 rDC.SetPen(bSel ? vDarkShadowPen : vHiLitePen);
db16e5c3 196 rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1
a5799260
DW
197 ,rDC.m_vRclPaint.yTop - 1
198 ,rDC.m_vRclPaint.xRight - 1
199 ,rDC.m_vRclPaint.yTop - 1
db16e5c3
DW
200 );
201 rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1
a5799260 202 ,rDC.m_vRclPaint.yTop - 1
db16e5c3 203 ,rDC.m_vRclPaint.xLeft + 1
a5799260 204 ,rDC.m_vRclPaint.yBottom + 1
db16e5c3
DW
205 );
206
a5799260 207 rDC.SetPen(bSel ? vHiLitePen : vDarkShadowPen);
db16e5c3 208 rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1
a5799260 209 ,rDC.m_vRclPaint.yBottom + 1
db16e5c3 210 ,rDC.m_vRclPaint.xRight - 1
a5799260 211 ,rDC.m_vRclPaint.yBottom + 1
db16e5c3
DW
212 );
213 rDC.DrawLine( rDC.m_vRclPaint.xRight - 1
db16e5c3 214 ,rDC.m_vRclPaint.yTop - 1
a5799260
DW
215 ,rDC.m_vRclPaint.xRight - 1
216 ,rDC.m_vRclPaint.yBottom + 1
db16e5c3 217 );
a5799260 218
db16e5c3
DW
219} // end of wxBitmapButton::DrawFace
220
221void wxBitmapButton::DrawButtonFocus (
222 wxClientDC& rDC
223)
37f214d5 224{
6670f564 225 wxPen vBlackPen(*wxBLACK, 2, wxSOLID);
db16e5c3
DW
226
227 //
228 // Draw a thick black line around the outside of the button
229 //
230 rDC.SetPen(vBlackPen);
231 rDC.DrawLine( rDC.m_vRclPaint.xLeft
232 ,rDC.m_vRclPaint.yTop
233 ,rDC.m_vRclPaint.xRight
234 ,rDC.m_vRclPaint.yTop
235 );
236 rDC.DrawLine( rDC.m_vRclPaint.xRight
237 ,rDC.m_vRclPaint.yTop
238 ,rDC.m_vRclPaint.xRight
239 ,rDC.m_vRclPaint.yBottom
240 );
241 rDC.DrawLine( rDC.m_vRclPaint.xRight
242 ,rDC.m_vRclPaint.yBottom
243 ,rDC.m_vRclPaint.xLeft
244 ,rDC.m_vRclPaint.yBottom
245 );
246 rDC.DrawLine( rDC.m_vRclPaint.xLeft
247 ,rDC.m_vRclPaint.yBottom
248 ,rDC.m_vRclPaint.xLeft
249 ,rDC.m_vRclPaint.yTop
250 );
251} // end of wxBitmapButton::DrawButtonFocus
252
6670f564
WS
253void wxBitmapButton::DrawButtonDisable( wxClientDC& rDC,
254 wxBitmap& rBmp )
db16e5c3 255{
6670f564 256 wxPen vGreyPen(wxT("GREY"), 2, wxSOLID);
db16e5c3
DW
257
258 //
259 // Draw a thick black line around the outside of the button
260 //
261 rDC.SetPen(vGreyPen);
262 rDC.DrawLine( rDC.m_vRclPaint.xLeft
263 ,rDC.m_vRclPaint.yTop
264 ,rDC.m_vRclPaint.xRight
265 ,rDC.m_vRclPaint.yTop
266 );
267 rDC.DrawLine( rDC.m_vRclPaint.xRight
268 ,rDC.m_vRclPaint.yTop
269 ,rDC.m_vRclPaint.xRight
270 ,rDC.m_vRclPaint.yBottom
271 );
272 rDC.DrawLine( rDC.m_vRclPaint.xRight
273 ,rDC.m_vRclPaint.yBottom
274 ,rDC.m_vRclPaint.xLeft
275 ,rDC.m_vRclPaint.yBottom
276 );
277 rDC.DrawLine( rDC.m_vRclPaint.xLeft
278 ,rDC.m_vRclPaint.yBottom
279 ,rDC.m_vRclPaint.xLeft
280 ,rDC.m_vRclPaint.yTop
281 );
282 wxDisableBitmap(rBmp, vGreyPen.GetColour().GetPixel());
283} // end of wxBitmapButton::DrawButtonDisable
37f214d5
DW
284
285void wxBitmapButton::SetDefault()
286{
287 wxButton::SetDefault();
288}
db16e5c3
DW
289
290#endif // ndef for wxUSE_BMPBUTTON