]> git.saurik.com Git - wxWidgets.git/blame - src/os2/gauge.cpp
- Added definition for struct SPBCDATA (missing in EMX).
[wxWidgets.git] / src / os2 / gauge.cpp
CommitLineData
0e320a79
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: gauge.cpp
3// Purpose: wxGauge class
0371a691 4// Author: David Webster
0e320a79 5// Modified by:
0371a691 6// Created: 10/06/99
0e320a79 7// RCS-ID: $Id$
0371a691
DW
8// Copyright: (c) David Webster
9// Licence: wxWindows licence
0e320a79
DW
10/////////////////////////////////////////////////////////////////////////////
11
0371a691
DW
12#include "wx/wxprec.h"
13
14#ifndef WX_PRECOMP
15#include "wx/defs.h"
16#include "wx/utils.h"
0e320a79
DW
17#endif
18
0371a691 19#include "wx/os2/private.h"
0e320a79
DW
20#include "wx/gauge.h"
21
3c299c3a
DW
22static WXFARPROC fnWndProcGauge = (WXFARPROC)NULL;
23extern void wxAssociateWinWithHandle( HWND hWnd
24 ,wxWindowOS2* pWin
25 );
0371a691 26
0e320a79 27IMPLEMENT_DYNAMIC_CLASS(wxGauge, wxControl)
0e320a79 28
3c299c3a
DW
29MRESULT EXPENTRY wxGaugeWndProc(
30 HWND hWnd
31, UINT uMessage
32, MPARAM wParam
33, MPARAM lParam
34)
0e320a79 35{
3c299c3a
DW
36 wxGauge* pGauge = (wxGauge *)::WinQueryWindowULong( hWnd
37 ,QWL_USER
38 );
39 wxWindowOS2* pWindow = NULL;
40 MRESULT rc = (MRESULT)0;
41 bool bProcessed = FALSE;
42 HPS hPS;
43 RECTL vRect;
44 RECTL vRect2;
45 double dPixelToRange = 0.0;
46 double dRange = 0.0;
47
48 switch (uMessage )
0371a691 49 {
3c299c3a
DW
50 case WM_PAINT:
51 hPS = ::WinBeginPaint( hWnd
52 ,NULLHANDLE
53 ,&vRect
54 );
55 if(hPS)
56 {
57 ::WinQueryWindowRect(hWnd, &vRect);
58 ::GpiCreateLogColorTable( hPS
59 ,0L
60 ,LCOLF_CONSECRGB
61 ,0L
62 ,(LONG)wxTheColourDatabase->m_nSize
63 ,(PLONG)wxTheColourDatabase->m_palTable
64 );
65 ::GpiCreateLogColorTable( hPS
66 ,0L
67 ,LCOLF_RGB
68 ,0L
69 ,0L
70 ,NULL
71 );
72 if (pGauge->GetWindowStyleFlag() & wxGA_VERTICAL)
73 {
74 dRange = (double)(vRect.yTop - vRect.yBottom);
75 dPixelToRange = dRange/(double)pGauge->GetRange();
76 vRect2.yTop = (int)(pGauge->GetValue() * dPixelToRange);
77 vRect2.yBottom = vRect.yBottom;
78 vRect2.xLeft = vRect.xLeft;
79 vRect2.xRight = vRect.xRight;
80 vRect.yBottom = vRect2.yTop;
81 ::WinFillRect(hPS, &vRect, pGauge->GetBackgroundColour().GetPixel());
82 ::WinFillRect(hPS, &vRect2, pGauge->GetForegroundColour().GetPixel());
83 }
84 else
85 {
86 dRange = (double)(vRect.xRight - vRect.xLeft);
87 dPixelToRange = dRange/(double)pGauge->GetRange();
88 vRect2.yTop = vRect.yTop;
89 vRect2.yBottom = vRect.yBottom;
90 vRect2.xLeft = vRect.xLeft;
91 vRect2.xRight = (int)(pGauge->GetValue() * dPixelToRange);
92 vRect.xLeft = vRect2.xRight;
93 ::WinFillRect(hPS, &vRect, pGauge->GetBackgroundColour().GetPixel());
94 ::WinFillRect(hPS, &vRect2, pGauge->GetForegroundColour().GetPixel());
95 }
96 ::WinEndPaint(hPS);
97 }
0371a691 98 }
3c299c3a
DW
99 return (fnWndProcGauge( hWnd
100 ,(ULONG)uMessage
101 ,(MPARAM)wParam
102 ,(MPARAM)lParam
103 )
104 );
105} // end of wxGaugeWndProc
106
107bool wxGauge::Create(
108 wxWindowOS2* pParent
109, wxWindowID vId
110, int nRange
111, const wxPoint& rPos
112, const wxSize& rSize
113, long lStyle
114#if wxUSE_VALIDATORS
115, const wxValidator& rValidator
116#endif
117, const wxString& rsName
118)
119{
120 int nX = rPos.x;
121 int nY = rPos.y;
122 int nWidth = rSize.x;
123 int nHeight = rSize.y;
124 long lMsStyle = 0L;
d8a3f66c 125 SWP vSwp;
0371a691 126
3c299c3a 127 SetName(rsName);
5d4b632b 128#if wxUSE_VALIDATORS
3c299c3a 129 SetValidator(rValidator);
5d4b632b 130#endif
3c299c3a
DW
131 if (pParent)
132 pParent->AddChild(this);
133 SetBackgroundColour(pParent->GetBackgroundColour()) ;
134 SetForegroundColour(pParent->GetForegroundColour()) ;
0e320a79 135
3c299c3a
DW
136 m_nRangeMax = nRange;
137 m_nGaugePos = 0;
138 m_windowStyle = lStyle;
0e320a79 139
3c299c3a
DW
140 if (vId == -1)
141 m_windowId = (int)NewControlId();
0e320a79 142 else
3c299c3a
DW
143 m_windowId = vId;
144
145 if (m_windowStyle & wxCLIP_SIBLINGS )
146 lMsStyle |= WS_CLIPSIBLINGS;
147
148 //
149 // OS/2 will use an edit control for this, since there is not a native gauge
150 // Other choices include using an armless slider but they are more difficult
151 // to control and manipulate
152 //
153
154 lMsStyle = WS_VISIBLE | ES_MARGIN | ES_LEFT | ES_READONLY;
155 if (m_windowStyle & wxCLIP_SIBLINGS)
156 lMsStyle |= WS_CLIPSIBLINGS;
157
5d44b24e
DW
158 //
159 // If the parent is a scrolled window the controls must
160 // have this style or they will overlap the scrollbars
161 //
162 if (pParent)
163 if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) ||
164 pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)))
165 lMsStyle |= WS_CLIPSIBLINGS;
3c299c3a
DW
166
167 m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
168 ,WC_ENTRYFIELD // Window class
169 ,(PSZ)NULL // Initial Text
170 ,(ULONG)lMsStyle // Style flags
171 ,0L, 0L, 0L, 0L // Origin -- 0 size
172 ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
173 ,HWND_TOP // initial z position
174 ,(HMENU)m_windowId // Window identifier
175 ,NULL // Slider control data
176 ,NULL // no Presentation parameters
177 );
178
179 wxAssociateWinWithHandle( m_hWnd
180 ,(wxWindowOS2*)this
181 );
182 ::WinSetWindowULong(GetHwnd(), QWL_USER, (LONG)this);
183 fnWndProcGauge = (WXFARPROC)::WinSubclassWindow(m_hWnd, (PFNWP)wxGaugeWndProc);
d8a3f66c
DW
184 ::WinQueryWindowPos(m_hWnd, &vSwp);
185 SetXComp(vSwp.x);
186 SetYComp(vSwp.y);
3c299c3a
DW
187 SetFont(pParent->GetFont());
188 if (nWidth == -1L)
189 nWidth = 50L;
190 if (nHeight == -1L)
191 nHeight = 28L;
192 SetSize( nX
193 ,nY
194 ,nWidth
195 ,nHeight
196 );
197 ::WinShowWindow((HWND)GetHWND(), TRUE);
198 return TRUE;
199} // end of wxGauge::Create
0e320a79 200
3c299c3a 201int wxGauge::GetBezelFace() const
0e320a79 202{
3c299c3a
DW
203 return 0;
204} // end of wxGauge::GetBezelFace
0e320a79 205
3c299c3a 206int wxGauge::GetRange() const
0e320a79 207{
3c299c3a
DW
208 return m_nRangeMax;
209} // end of wxGauge::GetRange
0e320a79
DW
210
211int wxGauge::GetShadowWidth() const
212{
0e320a79 213 return 0;
3c299c3a 214} // end of wxGauge::GetShadowWidth
0e320a79
DW
215
216int wxGauge::GetValue() const
217{
3c299c3a
DW
218 return m_nGaugePos;
219} // end of wxGauge::GetValue
0e320a79 220
3c299c3a
DW
221bool wxGauge::SetBackgroundColour(
222 const wxColour& rColour
223)
0371a691 224{
3c299c3a 225 if (!wxControl::SetBackgroundColour(rColour))
0371a691
DW
226 return FALSE;
227
3c299c3a 228 LONG lColor = (LONG)rColour.GetPixel();
0371a691 229
3c299c3a
DW
230 ::WinSetPresParam( GetHwnd()
231 ,PP_BACKGROUNDCOLOR
232 ,sizeof(LONG)
233 ,(PVOID)&lColor
234 );
0371a691 235 return TRUE;
3c299c3a 236} // end of wxGauge::SetBackgroundColour
0371a691 237
3c299c3a
DW
238void wxGauge::SetBezelFace(
239 int WXUNUSED(nWidth)
240)
0371a691 241{
3c299c3a 242} // end of wxGauge::SetBezelFace
0371a691 243
3c299c3a
DW
244bool wxGauge::SetForegroundColour(
245 const wxColour& rColour
246)
247{
248 if (!wxControl::SetForegroundColour(rColour))
249 return FALSE;
0371a691 250
3c299c3a 251 LONG lColor = (LONG)rColour.GetPixel();
0371a691 252
3c299c3a
DW
253 ::WinSetPresParam( GetHwnd()
254 ,PP_FOREGROUNDCOLOR
255 ,sizeof(LONG)
256 ,(PVOID)&lColor
257 );
0371a691 258
3c299c3a
DW
259 return TRUE;
260} // end of wxGauge::SetForegroundColour
0371a691 261
3c299c3a
DW
262void wxGauge::SetRange(
263 int nRange
264)
265{
266 m_nRangeMax = nRange;
267} // end of wxGauge::SetRange
0371a691 268
3c299c3a
DW
269void wxGauge::SetShadowWidth(
270 int WXUNUSED(nWidth)
271)
272{
273} // end of wxGauge::SetShadowWidth
0371a691 274
3c299c3a
DW
275void wxGauge::SetValue(
276 int nPos
277)
278{
279 RECT vRect;
0371a691 280
3c299c3a
DW
281 m_nGaugePos = nPos;
282 ::WinQueryWindowRect(GetHwnd(), &vRect);
283 ::WinInvalidateRect(GetHwnd(), &vRect, FALSE);
284} // end of wxGauge::SetValue
0371a691
DW
285
286