]> git.saurik.com Git - wxWidgets.git/blame - src/msw/checkbox.cpp
Changed order of #ifdefs to get native version on OS/2, even if
[wxWidgets.git] / src / msw / checkbox.cpp
CommitLineData
2bda0e17
KB
1/////////////////////////////////////////////////////////////////////////////
2// Name: checkbox.cpp
3// Purpose: wxCheckBox
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart and Markus Holzem
4438caf4 9// Licence: wxWindows license
2bda0e17
KB
10/////////////////////////////////////////////////////////////////////////////
11
4438caf4
VZ
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
2bda0e17 20#ifdef __GNUG__
4438caf4 21 #pragma implementation "checkbox.h"
2bda0e17
KB
22#endif
23
24// For compilers that support precompilation, includes "wx.h".
25#include "wx/wxprec.h"
26
27#ifdef __BORLANDC__
4438caf4 28 #pragma hdrstop
2bda0e17
KB
29#endif
30
31#ifndef WX_PRECOMP
4438caf4
VZ
32 #include "wx/checkbox.h"
33 #include "wx/brush.h"
2bda0e17
KB
34#endif
35
36#include "wx/msw/private.h"
37
4438caf4
VZ
38// ----------------------------------------------------------------------------
39// macros
40// ----------------------------------------------------------------------------
41
11b6a93b
VZ
42IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl)
43IMPLEMENT_DYNAMIC_CLASS(wxBitmapCheckBox, wxCheckBox)
2bda0e17 44
4438caf4
VZ
45// ============================================================================
46// implementation
47// ============================================================================
48
49// ----------------------------------------------------------------------------
50// wxCheckBox
51// ----------------------------------------------------------------------------
52
debe6624 53bool wxCheckBox::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id))
2bda0e17 54{
4438caf4
VZ
55 wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, m_windowId);
56 event.SetInt(GetValue());
57 event.SetEventObject(this);
58 ProcessCommand(event);
59 return TRUE;
2bda0e17
KB
60}
61
62// Single check box item
11b6a93b
VZ
63bool wxCheckBox::Create(wxWindow *parent,
64 wxWindowID id,
65 const wxString& label,
66 const wxPoint& pos,
67 const wxSize& size, long style,
68 const wxValidator& validator,
69 const wxString& name)
2bda0e17 70{
4438caf4 71 SetName(name);
11b6a93b 72#if wxUSE_VALIDATORS
4438caf4 73 SetValidator(validator);
11b6a93b 74#endif // wxUSE_VALIDATORS
4438caf4
VZ
75 if (parent) parent->AddChild(this);
76
77 SetBackgroundColour(parent->GetBackgroundColour()) ;
78 SetForegroundColour(parent->GetForegroundColour()) ;
79
80 m_windowStyle = style;
81
82 wxString Label = label;
223d09f6
KB
83 if (Label == wxT(""))
84 Label = wxT(" "); // Apparently needed or checkbox won't show
4438caf4
VZ
85
86 if ( id == -1 )
87 m_windowId = NewControlId();
88 else
89 m_windowId = id;
90
91 int x = pos.x;
92 int y = pos.y;
93 int width = size.x;
94 int height = size.y;
95
96 long msStyle = BS_AUTOCHECKBOX | WS_TABSTOP | WS_CHILD | WS_VISIBLE;
97 if ( style & wxALIGN_RIGHT )
98 msStyle |= BS_LEFTTEXT;
99
100 // We perhaps have different concepts of 3D here - a 3D border,
101 // versus a 3D button.
102 // So we only wish to give a border if this is specified
103 // in the style.
104 bool want3D;
105 WXDWORD exStyle = Determine3DEffects(0, &want3D) ;
106
107 // Even with extended styles, need to combine with WS_BORDER
108 // for them to look right.
109 /*
110 if ( want3D || wxStyleHasBorder(m_windowStyle) )
111 msStyle |= WS_BORDER;
112 */
113
223d09f6 114 m_hWnd = (WXHWND)CreateWindowEx(exStyle, wxT("BUTTON"), Label,
4438caf4
VZ
115 msStyle,
116 0, 0, 0, 0,
117 (HWND)parent->GetHWND(), (HMENU)m_windowId,
118 wxGetInstance(), NULL);
2bda0e17 119
1f112209 120#if wxUSE_CTL3D
4438caf4
VZ
121 if (want3D)
122 {
123 Ctl3dSubclassCtl(GetHwnd());
124 m_useCtl3D = TRUE;
125 }
2bda0e17
KB
126#endif
127
4438caf4
VZ
128 // Subclass again for purposes of dialog editing mode
129 SubclassWin(m_hWnd);
2bda0e17 130
4438caf4 131 SetFont(parent->GetFont());
2bda0e17 132
4438caf4
VZ
133 SetSize(x, y, width, height);
134
135 return TRUE;
2bda0e17
KB
136}
137
138void wxCheckBox::SetLabel(const wxString& label)
139{
4438caf4 140 SetWindowText(GetHwnd(), label);
2bda0e17
KB
141}
142
f68586e5 143wxSize wxCheckBox::DoGetBestSize() const
2bda0e17 144{
4438caf4 145 int wCheckbox, hCheckbox;
81d66cf3 146
4438caf4 147 wxString str = wxGetWindowText(GetHWND());
2bda0e17 148
4438caf4
VZ
149 if ( !str.IsEmpty() )
150 {
151 GetTextExtent(str, &wCheckbox, &hCheckbox);
152 wCheckbox += RADIO_SIZE;
27fda0b6 153
4438caf4
VZ
154 if ( hCheckbox < RADIO_SIZE )
155 hCheckbox = RADIO_SIZE;
156 }
157 else
2bda0e17 158 {
4438caf4
VZ
159 wCheckbox = RADIO_SIZE;
160 hCheckbox = RADIO_SIZE;
2bda0e17
KB
161 }
162
4438caf4 163 return wxSize(wCheckbox, hCheckbox);
2bda0e17
KB
164}
165
debe6624 166void wxCheckBox::SetValue(bool val)
2bda0e17 167{
4438caf4 168 SendMessage(GetHwnd(), BM_SETCHECK, val, 0);
2bda0e17
KB
169}
170
2432b92d
JS
171#ifndef BST_CHECKED
172#define BST_CHECKED 0x0001
173#endif
174
bfc6fde4 175bool wxCheckBox::GetValue() const
2bda0e17
KB
176{
177#ifdef __WIN32__
4438caf4 178 return (SendMessage(GetHwnd(), BM_GETCHECK, 0, 0) == BST_CHECKED);
2bda0e17 179#else
4438caf4 180 return ((0x003 & SendMessage(GetHwnd(), BM_GETCHECK, 0, 0)) == 0x003);
2bda0e17
KB
181#endif
182}
183
2bda0e17
KB
184void wxCheckBox::Command (wxCommandEvent & event)
185{
186 SetValue ((event.GetInt() != 0));
187 ProcessCommand (event);
188}
189
4438caf4
VZ
190// ----------------------------------------------------------------------------
191// wxBitmapCheckBox
192// ----------------------------------------------------------------------------
193
debe6624 194bool wxBitmapCheckBox::Create(wxWindow *parent, wxWindowID id, const wxBitmap *label,
2bda0e17 195 const wxPoint& pos,
debe6624 196 const wxSize& size, long style,
2bda0e17
KB
197 const wxValidator& validator,
198 const wxString& name)
199{
200 SetName(name);
11b6a93b 201#if wxUSE_VALIDATORS
2bda0e17 202 SetValidator(validator);
11b6a93b 203#endif // wxUSE_VALIDATORS
2bda0e17
KB
204 if (parent) parent->AddChild(this);
205
fd71308f
JS
206 SetBackgroundColour(parent->GetBackgroundColour()) ;
207 SetForegroundColour(parent->GetForegroundColour()) ;
2bda0e17
KB
208 m_windowStyle = style;
209
4438caf4
VZ
210 if ( id == -1 )
211 m_windowId = NewControlId();
212 else
213 m_windowId = id;
2bda0e17
KB
214
215 int x = pos.x;
216 int y = pos.y;
217 int width = size.x;
218 int height = size.y;
219
220 checkWidth = -1 ;
221 checkHeight = -1 ;
222 long msStyle = CHECK_FLAGS;
223
223d09f6 224 HWND wx_button = CreateWindowEx(MakeExtendedStyle(m_windowStyle), CHECK_CLASS, wxT("toggle"),
2bda0e17
KB
225 msStyle,
226 0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)m_windowId,
227 wxGetInstance(), NULL);
228
1f112209 229#if wxUSE_CTL3D
2bda0e17
KB
230 if (!(GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS))
231 {
232 Ctl3dSubclassCtl(wx_button);
4438caf4 233 m_useCtl3D = TRUE;
2bda0e17
KB
234 }
235#endif
236
237 m_hWnd = (WXHWND)wx_button;
238
239 // Subclass again for purposes of dialog editing mode
240 SubclassWin((WXHWND)wx_button);
241
2bda0e17
KB
242 SetSize(x, y, width, height);
243
244 ShowWindow(wx_button, SW_SHOW);
4438caf4 245
2bda0e17
KB
246 return TRUE;
247}
248
acbd13a3 249void wxBitmapCheckBox::SetLabel(const wxBitmap& bitmap)
2bda0e17 250{
223d09f6 251 wxFAIL_MSG(wxT("not implemented"));
2bda0e17 252}