1 /////////////////////////////////////////////////////////////////////////////
2 // Name: msw/checkbox.cpp
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
21 #pragma implementation "checkbox.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
34 #include "wx/checkbox.h"
36 #include "wx/dcscreen.h"
37 #include "wx/settings.h"
40 #include "wx/msw/private.h"
43 #define BST_UNCHECKED 0x0000
47 #define BST_CHECKED 0x0001
50 #ifndef BST_INDETERMINATE
51 #define BST_INDETERMINATE 0x0002
54 // ============================================================================
56 // ============================================================================
58 #if wxUSE_EXTENDED_RTTI
59 WX_DEFINE_FLAGS( wxCheckBoxStyle
)
61 wxBEGIN_FLAGS( wxCheckBoxStyle
)
62 // new style border flags, we put them first to
63 // use them for streaming out
64 wxFLAGS_MEMBER(wxBORDER_SIMPLE
)
65 wxFLAGS_MEMBER(wxBORDER_SUNKEN
)
66 wxFLAGS_MEMBER(wxBORDER_DOUBLE
)
67 wxFLAGS_MEMBER(wxBORDER_RAISED
)
68 wxFLAGS_MEMBER(wxBORDER_STATIC
)
69 wxFLAGS_MEMBER(wxBORDER_NONE
)
71 // old style border flags
72 wxFLAGS_MEMBER(wxSIMPLE_BORDER
)
73 wxFLAGS_MEMBER(wxSUNKEN_BORDER
)
74 wxFLAGS_MEMBER(wxDOUBLE_BORDER
)
75 wxFLAGS_MEMBER(wxRAISED_BORDER
)
76 wxFLAGS_MEMBER(wxSTATIC_BORDER
)
77 wxFLAGS_MEMBER(wxNO_BORDER
)
79 // standard window styles
80 wxFLAGS_MEMBER(wxTAB_TRAVERSAL
)
81 wxFLAGS_MEMBER(wxCLIP_CHILDREN
)
82 wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW
)
83 wxFLAGS_MEMBER(wxWANTS_CHARS
)
84 wxFLAGS_MEMBER(wxNO_FULL_REPAINT_ON_RESIZE
)
85 wxFLAGS_MEMBER(wxALWAYS_SHOW_SB
)
86 wxFLAGS_MEMBER(wxVSCROLL
)
87 wxFLAGS_MEMBER(wxHSCROLL
)
89 wxEND_FLAGS( wxCheckBoxStyle
)
91 IMPLEMENT_DYNAMIC_CLASS_XTI(wxCheckBox
, wxControl
,"wx/checkbox.h")
93 wxBEGIN_PROPERTIES_TABLE(wxCheckBox
)
94 wxEVENT_PROPERTY( Click
, wxEVT_COMMAND_CHECKBOX_CLICKED
, wxCommandEvent
)
96 wxPROPERTY( Font
, wxFont
, SetFont
, GetFont
, , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
97 wxPROPERTY( Label
,wxString
, SetLabel
, GetLabel
, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
98 wxPROPERTY( Value
,bool, SetValue
, GetValue
, , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
99 wxPROPERTY_FLAGS( WindowStyle
, wxCheckBoxStyle
, long , SetWindowStyleFlag
, GetWindowStyleFlag
, , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
100 wxEND_PROPERTIES_TABLE()
102 wxBEGIN_HANDLERS_TABLE(wxCheckBox
)
103 wxEND_HANDLERS_TABLE()
105 wxCONSTRUCTOR_6( wxCheckBox
, wxWindow
* , Parent
, wxWindowID
, Id
, wxString
, Label
, wxPoint
, Position
, wxSize
, Size
, long , WindowStyle
)
107 IMPLEMENT_DYNAMIC_CLASS(wxCheckBox
, wxControl
)
111 // ----------------------------------------------------------------------------
113 // ----------------------------------------------------------------------------
115 wxCheckBoxBase::wxCheckBoxBase()
119 bool wxCheckBox::MSWCommand(WXUINT
WXUNUSED(param
), WXWORD
WXUNUSED(id
))
121 wxCommandEvent
event(wxEVT_COMMAND_CHECKBOX_CLICKED
, m_windowId
);
122 wxCheckBoxState state
= Get3StateValue();
124 // If the style flag to allow the user setting the undetermined state
125 // is not set, then skip the undetermined state and set it to unchecked.
126 if ( state
== wxCHK_UNDETERMINED
&& !Is3rdStateAllowedForUser() )
128 state
= wxCHK_UNCHECKED
;
129 Set3StateValue(state
);
133 event
.SetEventObject(this);
134 ProcessCommand(event
);
139 bool wxCheckBox::Create(wxWindow
*parent
,
141 const wxString
& label
,
143 const wxSize
& size
, long style
,
144 const wxValidator
& validator
,
145 const wxString
& name
)
147 if ( !CreateControl(parent
, id
, pos
, size
, style
, validator
, name
) )
150 long msStyle
= WS_TABSTOP
;
152 if ( style
& wxCHK_3STATE
)
154 msStyle
|= BS_AUTO3STATE
;
158 wxASSERT_MSG( !Is3rdStateAllowedForUser(),
159 wxT("Using wxCH_ALLOW_3RD_STATE_FOR_USER")
160 wxT(" style flag for a 2-state checkbox is useless") );
161 msStyle
|= BS_AUTOCHECKBOX
;
164 if ( style
& wxALIGN_RIGHT
)
166 msStyle
|= BS_LEFTTEXT
;
169 return MSWCreateControl(wxT("BUTTON"), msStyle
, pos
, size
, label
, 0);
172 void wxCheckBox::SetLabel(const wxString
& label
)
174 SetWindowText(GetHwnd(), label
);
177 wxSize
wxCheckBox::DoGetBestSize() const
179 static int s_checkSize
= 0;
184 dc
.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
));
186 s_checkSize
= dc
.GetCharHeight();
189 wxString str
= wxGetWindowText(GetHWND());
191 int wCheckbox
, hCheckbox
;
192 if ( !str
.IsEmpty() )
194 GetTextExtent(str
, &wCheckbox
, &hCheckbox
);
195 wCheckbox
+= s_checkSize
+ GetCharWidth();
197 if ( hCheckbox
< s_checkSize
)
198 hCheckbox
= s_checkSize
;
202 wCheckbox
= s_checkSize
;
203 hCheckbox
= s_checkSize
;
206 return wxSize(wCheckbox
, hCheckbox
);
209 void wxCheckBox::SetValue(bool val
)
213 Set3StateValue(wxCHK_CHECKED
);
217 Set3StateValue(wxCHK_UNCHECKED
);
221 bool wxCheckBox::GetValue() const
223 return (Get3StateValue() != 0);
226 void wxCheckBox::Command(wxCommandEvent
& event
)
228 int state
= event
.GetInt();
229 wxCHECK_RET( (state
== wxCHK_UNCHECKED
) || (state
== wxCHK_CHECKED
)
230 || (state
== wxCHK_UNDETERMINED
),
231 wxT("event.GetInt() returned an invalid checkbox state") );
233 Set3StateValue((wxCheckBoxState
) state
);
234 ProcessCommand(event
);
237 wxCOMPILE_TIME_ASSERT(wxCHK_UNCHECKED
== BST_UNCHECKED
238 && wxCHK_CHECKED
== BST_CHECKED
239 && wxCHK_UNDETERMINED
== BST_INDETERMINATE
, EnumValuesIncorrect
);
241 void wxCheckBox::DoSet3StateValue(wxCheckBoxState state
)
243 ::SendMessage(GetHwnd(), BM_SETCHECK
, (WPARAM
) state
, 0);
246 wxCheckBoxState
wxCheckBox::DoGet3StateValue() const
249 return (wxCheckBoxState
) ::SendMessage(GetHwnd(), BM_GETCHECK
, 0, 0);
251 return (wxCheckBoxState
) ((::SendMessage(GetHwnd(), BM_GETCHECK
, 0, 0)
257 #endif // wxUSE_CHECKBOX