1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2004 Novell, Inc.
23 // Dennis Hayes dennish@raytek.com
24 // Peter Bartok pbartok@novell.com
29 // $Log: CheckBox.cs,v $
30 // Revision 1.1 2004/07/09 05:21:25 pbartok
37 namespace System.Windows.Forms {
38 public class CreateParams {
39 #region Public Constructors
40 #endregion // Public Constructors
42 #region Public Instance Properties
43 #endregion // Public Instance Properties
45 #region Public Instance Methods
46 #endregion // Public Instance Methods
50 // System.Windows.Forms.CheckBox.cs
53 // stubbed out by Jaak Simm (jaaksimm@firm.ee)
54 // Dennis Hayes (dennish@Raytek.com)
56 // (C) Ximian, Inc., 2002
61 namespace System.Windows.Forms {
64 /// Represents a Windows check box.
68 public class CheckBox : ButtonBase {
71 Appearance appearance;
73 ContentAlignment checkAlign;
75 CheckState checkState;
77 ContentAlignment textAlign;
80 StringFormat textFormat;
81 int checkMarkSize=13; // Keep it configurable for accessability
85 // --- Constructor ---
86 public CheckBox() : base()
89 appearance = Appearance.Normal;
91 checkAlign = ContentAlignment.MiddleLeft;
93 checkState = CheckState.Unchecked;
96 canvasBmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
97 canvasDC = Graphics.FromImage(canvasBmp);
99 /* Set defaults for drawing text... */
100 textAlign = ContentAlignment.MiddleLeft;
101 textFormat = new StringFormat();
102 textFormat.Alignment=StringAlignment.Near;
103 textFormat.LineAlignment=StringAlignment.Center;
104 textRect = ClientRectangle;
105 textRect.X+=checkMarkSize;
106 textRect.Width-=checkMarkSize;
108 /* ... and for drawing our checkbox */
109 checkRect.X=ClientRectangle.Left;
110 checkRect.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkMarkSize/2;
111 checkRect.Width=checkMarkSize;
112 checkRect.Height=checkMarkSize;
114 SizeChanged+=new System.EventHandler(CheckboxSizeChanged);
115 GotFocus+=new System.EventHandler(CheckboxUpdate);
116 LostFocus+=new System.EventHandler(CheckboxUpdate);
117 TextChanged+=new System.EventHandler(CheckboxUpdate);
119 SubClassWndProc_ = true;
120 SetStyle (ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
121 callWinControlProcMask &= ~(CallWinControlProcMask.MOUSE_MESSAGES | CallWinControlProcMask.KEYBOARD_MESSAGES);
124 // --- CheckBox Properties ---
125 public Appearance Appearance {
126 get { return appearance; }
127 set { appearance=value; }
130 public bool AutoCheck {
131 get { return autoCheck; }
132 set { autoCheck = value; }
135 public ContentAlignment CheckAlign {
136 get { return checkAlign; }
143 public bool Checked {
144 get { return _checked; }
146 if( _checked != value) {
147 CheckState = (value) ? CheckState.Checked : CheckState.Unchecked;
152 public CheckState CheckState {
153 get { return checkState; }
155 if( checkState != value) {
158 bool oldChecked = _checked;
160 if( checkState == CheckState.Unchecked) {
167 if( oldChecked != _checked) {
168 OnCheckedChanged(new EventArgs());
171 OnCheckStateChanged(new EventArgs());
177 protected override CreateParams CreateParams {
179 CreateParams createParams = base.CreateParams;
181 createParams.ClassName = "BUTTON";
183 createParams.Style = (int) (
184 (int)WindowStyles.WS_CHILD |
185 (int)WindowStyles.WS_VISIBLE |
186 (int)ButtonStyles.BS_CHECKBOX |
187 (int)ButtonStyles.BS_NOTIFY |
188 (int)WindowStyles.WS_CLIPSIBLINGS |
189 (int)WindowStyles.WS_CLIPCHILDREN |
190 (int)WindowStyles.WS_TABSTOP |
191 (int)SS_Static_Control_Types.SS_LEFT );
194 createParams.Style |= (int)ButtonStyles.BS_AUTOCHECKBOX;
197 /* We need this, we draw ourselves */
198 createParams.Style |= (int) ButtonStyles.BS_OWNERDRAW;
205 protected override Size DefaultSize {
206 get { return new Size(100,checkMarkSize); }
210 public override ContentAlignment TextAlign {
220 public bool ThreeState {
230 // --- CheckBox methods ---
232 protected override AccessibleObject CreateAccessibilityInstance()
234 throw new NotImplementedException ();
240 protected virtual void OnAppearanceChanged(EventArgs e)
242 if (AppearanceChanged != null) {
243 AppearanceChanged(this, e);
248 protected virtual void OnCheckedChanged(EventArgs e)
251 if(CheckedChanged != null) {
252 CheckedChanged( this, e);
257 protected virtual void OnCheckStateChanged(EventArgs e)
260 if(CheckStateChanged != null) {
261 CheckStateChanged( this, e);
266 protected override void OnClick(EventArgs e)
268 CheckState = (CheckState)Win32.SendMessage(Handle, (int)ButtonMessages.BM_GETCHECK, 0, 0);
273 protected override void OnHandleCreated(EventArgs e)
276 base.OnHandleCreated(e);
277 Win32.SendMessage(Handle, (int)ButtonMessages.BM_SETCHECK, (int)checkState, 0);
280 // protected override void OnMouseDown (MouseEventArgs e)
282 // base.OnMouseDown (e);
286 protected override void OnMouseUp(MouseEventArgs mevent)
289 switch (CheckState) {
290 case CheckState.Unchecked: {
291 CheckState = CheckState.Checked;
295 case CheckState.Indeterminate: {
296 CheckState = CheckState.Unchecked;
300 case CheckState.Checked: {
301 CheckState = CheckState.Indeterminate;
306 Checked = Checked ? false : true;
310 base.OnMouseUp(mevent);
312 // end of [event methods]
316 protected override bool ProcessMnemonic(char charCode)
319 return base.ProcessMnemonic(charCode);
323 //FIXME: do a better tostring
324 public override string ToString()
327 return "CheckBox" + " Checked";
329 return "CheckBox" + " Unchecked";
333 internal override void ButtonPaint (PaintEventArgs e)
335 if (canvasBmp!=null) {
336 e.Graphics.DrawImage(canvasBmp, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel);
340 /// --- CheckBox events ---
341 public event EventHandler AppearanceChanged;
342 public event EventHandler CheckedChanged;
343 public event EventHandler CheckStateChanged;
345 /// --- public class CheckBox.CheckBoxAccessibleObject : AccessibleObject ---
346 /// the class is only used for .NET framework
348 public class CheckBoxAccessibleObject : AccessibleObject {
351 private void UpdateCheckbox() {
352 /* Calculate the position of text and checkbox rectangle */
353 if (appearance!=Appearance.Button) {
355 case ContentAlignment.BottomCenter: {
356 if (ClientRectangle.Height<checkMarkSize*2) {
357 ClientSize=new Size(ClientRectangle.Width, checkMarkSize*2);
359 checkRect.X=(ClientRectangle.Right-ClientRectangle.Left)/2-checkMarkSize/2;
360 checkRect.Y=ClientRectangle.Bottom-checkMarkSize;
361 textRect.X=ClientRectangle.X;
362 textRect.Width=ClientRectangle.Width;
366 case ContentAlignment.BottomLeft: {
367 checkRect.X=ClientRectangle.Left;
368 checkRect.Y=ClientRectangle.Bottom-checkMarkSize;
369 textRect.X=ClientRectangle.X+checkMarkSize;
370 textRect.Width=ClientRectangle.Width-checkMarkSize;
374 case ContentAlignment.BottomRight: {
375 checkRect.X=ClientRectangle.Right-checkMarkSize;
376 checkRect.Y=ClientRectangle.Bottom-checkMarkSize;
377 textRect.X=ClientRectangle.X;
378 textRect.Width=ClientRectangle.Width-checkMarkSize;
382 case ContentAlignment.MiddleCenter: {
383 checkRect.X=(ClientRectangle.Right-ClientRectangle.Left)/2-checkMarkSize/2;
384 checkRect.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkMarkSize/2;
385 textRect.X=ClientRectangle.X;
386 textRect.Width=ClientRectangle.Width;
391 case ContentAlignment.MiddleLeft: {
392 checkRect.X=ClientRectangle.Left;
393 checkRect.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkMarkSize/2;
394 textRect.X=ClientRectangle.X+checkMarkSize;
395 textRect.Width=ClientRectangle.Width-checkMarkSize;
399 case ContentAlignment.MiddleRight: {
400 checkRect.X=ClientRectangle.Right-checkMarkSize;
401 checkRect.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkMarkSize/2;
402 textRect.X=ClientRectangle.X;
403 textRect.Width=ClientRectangle.Width-checkMarkSize;
407 case ContentAlignment.TopCenter: {
408 if (ClientRectangle.Height<checkMarkSize*2) {
409 ClientSize=new Size(ClientRectangle.Width, checkMarkSize*2);
411 checkRect.X=(ClientRectangle.Right-ClientRectangle.Left)/2-checkMarkSize/2;
412 checkRect.Y=ClientRectangle.Top;
413 textRect.X=ClientRectangle.X;
414 textRect.Y=checkMarkSize;
415 textRect.Width=ClientRectangle.Width;
416 textRect.Height=ClientRectangle.Height-checkMarkSize;
420 case ContentAlignment.TopLeft: {
421 checkRect.X=ClientRectangle.Left;
422 checkRect.Y=ClientRectangle.Top;
423 textRect.X=ClientRectangle.X+checkMarkSize;
424 textRect.Width=ClientRectangle.Width-checkMarkSize;
428 case ContentAlignment.TopRight: {
429 checkRect.X=ClientRectangle.Right-checkMarkSize;
430 checkRect.Y=ClientRectangle.Top;
431 textRect.X=ClientRectangle.X;
432 textRect.Width=ClientRectangle.Width-checkMarkSize;
437 textRect.X=ClientRectangle.X;
438 textRect.Width=ClientRectangle.Width;
441 /* Set the horizontal alignment of our text */
443 case ContentAlignment.BottomLeft:
444 case ContentAlignment.MiddleLeft:
445 case ContentAlignment.TopLeft: {
446 textFormat.Alignment=StringAlignment.Near;
450 case ContentAlignment.BottomCenter:
451 case ContentAlignment.MiddleCenter:
452 case ContentAlignment.TopCenter: {
453 textFormat.Alignment=StringAlignment.Center;
457 case ContentAlignment.BottomRight:
458 case ContentAlignment.MiddleRight:
459 case ContentAlignment.TopRight: {
460 textFormat.Alignment=StringAlignment.Far;
465 /* Set the vertical alignment of our text */
467 case ContentAlignment.TopLeft:
468 case ContentAlignment.TopCenter:
469 case ContentAlignment.TopRight: {
470 textFormat.LineAlignment=StringAlignment.Near;
474 case ContentAlignment.BottomLeft:
475 case ContentAlignment.BottomCenter:
476 case ContentAlignment.BottomRight: {
477 textFormat.LineAlignment=StringAlignment.Far;
481 case ContentAlignment.MiddleLeft:
482 case ContentAlignment.MiddleCenter:
483 case ContentAlignment.MiddleRight: {
484 textFormat.LineAlignment=StringAlignment.Center;
492 private void CheckboxRedraw() {
495 /* Build the image representing the control */
497 if (canvasDC!=null) {
500 if (canvasBmp!=null) {
504 if (ClientRectangle.Width<1 || ClientRectangle.Height<1) {
507 canvasBmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
508 canvasDC = Graphics.FromImage(canvasBmp);
510 sb=new SolidBrush(BackColor);
511 canvasDC.FillRectangle(sb, ClientRectangle);
514 ButtonState state = ButtonState.Normal;
515 if (FlatStyle == FlatStyle.Flat) {
516 state |= ButtonState.Flat;
520 state |= ButtonState.Checked;
523 if (ThreeState && (CheckState == CheckState.Indeterminate)) {
524 state |= ButtonState.Checked;
525 state |= ButtonState.Pushed;
528 if (appearance!=Appearance.Button) {
529 ControlPaint.DrawCheckBox(canvasDC, checkRect, state);
531 ControlPaint.DrawButton(canvasDC, textRect, state);
534 /* Place the text; to be compatible with Windows place it after the checkbox has been drawn */
535 sb=new SolidBrush(base.foreColor);
536 canvasDC.DrawString(Text, Font, sb, textRect, textFormat);
540 ControlPaint.DrawFocusRectangle(canvasDC, textRect);
544 private void CheckboxUpdate(object sender, System.EventArgs e) {
545 /* Force recalculation of text & checkbox rectangles */
549 private void CheckboxSizeChanged(object sender, System.EventArgs e)
551 /* Force recalculation of text & checkbox rectangles */
552 textRect.Y=ClientRectangle.Y;
553 textRect.Height=ClientRectangle.Height;