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
, EMPTY_MACROVALUE
, 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
, EMPTY_MACROVALUE
, 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
99 wxPROPERTY_FLAGS( WindowStyle
, wxCheckBoxStyle
, long , SetWindowStyleFlag
, GetWindowStyleFlag
, EMPTY_MACROVALUE
, 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 bool wxCheckBox::MSWCommand(WXUINT
WXUNUSED(param
), WXWORD
WXUNUSED(id
))
117 wxCommandEvent
event(wxEVT_COMMAND_CHECKBOX_CLICKED
, m_windowId
);
118 wxCheckBoxState state
= Get3StateValue();
120 // If the style flag to allow the user setting the undetermined state
121 // is not set, then skip the undetermined state and set it to unchecked.
122 if ( state
== wxCHK_UNDETERMINED
&& !Is3rdStateAllowedForUser() )
124 state
= wxCHK_UNCHECKED
;
125 Set3StateValue(state
);
129 event
.SetEventObject(this);
130 ProcessCommand(event
);
135 bool wxCheckBox::Create(wxWindow
*parent
,
137 const wxString
& label
,
139 const wxSize
& size
, long style
,
140 const wxValidator
& validator
,
141 const wxString
& name
)
143 if ( !CreateControl(parent
, id
, pos
, size
, style
, validator
, name
) )
146 long msStyle
= WS_TABSTOP
;
148 if ( style
& wxCHK_3STATE
)
150 msStyle
|= BS_AUTO3STATE
;
154 wxASSERT_MSG( !Is3rdStateAllowedForUser(),
155 wxT("Using wxCH_ALLOW_3RD_STATE_FOR_USER")
156 wxT(" style flag for a 2-state checkbox is useless") );
157 msStyle
|= BS_AUTOCHECKBOX
;
160 if ( style
& wxALIGN_RIGHT
)
162 msStyle
|= BS_LEFTTEXT
| BS_RIGHT
;
165 return MSWCreateControl(wxT("BUTTON"), msStyle
, pos
, size
, label
, 0);
169 wxSize
wxCheckBox::DoGetBestSize() const
171 static int s_checkSize
= 0;
176 dc
.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
));
178 s_checkSize
= dc
.GetCharHeight();
181 wxString str
= wxGetWindowText(GetHWND());
183 int wCheckbox
, hCheckbox
;
184 if ( !str
.IsEmpty() )
186 GetTextExtent(str
, &wCheckbox
, &hCheckbox
);
187 wCheckbox
+= s_checkSize
+ GetCharWidth();
189 if ( hCheckbox
< s_checkSize
)
190 hCheckbox
= s_checkSize
;
194 wCheckbox
= s_checkSize
;
195 hCheckbox
= s_checkSize
;
201 return wxSize(wCheckbox
, hCheckbox
);
204 void wxCheckBox::SetValue(bool val
)
208 Set3StateValue(wxCHK_CHECKED
);
212 Set3StateValue(wxCHK_UNCHECKED
);
216 bool wxCheckBox::GetValue() const
218 return (Get3StateValue() != 0);
221 void wxCheckBox::Command(wxCommandEvent
& event
)
223 int state
= event
.GetInt();
224 wxCHECK_RET( (state
== wxCHK_UNCHECKED
) || (state
== wxCHK_CHECKED
)
225 || (state
== wxCHK_UNDETERMINED
),
226 wxT("event.GetInt() returned an invalid checkbox state") );
228 Set3StateValue((wxCheckBoxState
) state
);
229 ProcessCommand(event
);
232 wxCOMPILE_TIME_ASSERT(wxCHK_UNCHECKED
== BST_UNCHECKED
233 && wxCHK_CHECKED
== BST_CHECKED
234 && wxCHK_UNDETERMINED
== BST_INDETERMINATE
, EnumValuesIncorrect
);
236 void wxCheckBox::DoSet3StateValue(wxCheckBoxState state
)
238 ::SendMessage(GetHwnd(), BM_SETCHECK
, (WPARAM
) state
, 0);
241 wxCheckBoxState
wxCheckBox::DoGet3StateValue() const
244 return (wxCheckBoxState
) ::SendMessage(GetHwnd(), BM_GETCHECK
, 0, 0);
246 return (wxCheckBoxState
) ((::SendMessage(GetHwnd(), BM_GETCHECK
, 0, 0)
252 #endif // wxUSE_CHECKBOX