1: // 功能:复选框
2: // 描述:
3: // 编码:温伟鹏
4: // 日期:12/18/2008 11:48:34
5:
6: using System;
7: using System.Collections.Generic;
8: using System.Text;
9: using System.ComponentModel;
10: using System.Drawing;
11: using System.Windows.Forms;
12: using System.Drawing.Drawing2D;
13: using Esint.UI.Common;
14:
15: namespace Esint.UI.WinFormUI
16: {
17: [ToolboxItem(true)]
18: public class CheckBox:ControlBase
19: {
20: /// <summary>
21: /// Checked属性修改事件
22: /// </summary>
23: public event EventHandler CheckedChanged;
24:
25: private bool isChecked;
26: /// <summary>
27: /// 获取或设置控件是否选中
28: /// </summary>
29: [Category("Appearance"), DefaultValue(false), Description("获取或设置控件是否选中")]
30: public bool Checked
31: {
32: get {
33: return this.isChecked;
34: }
35: set {
36: isChecked = value;
37:
38: this.Refresh();
39:
40: if (CheckedChanged != null)
41: {
42: CheckedChanged(this, null);
43: }
44: }
45: }
46:
47: public CheckBox()
48: :base()
49: {
50: }
51:
52: protected override void InitializeBorder()
53: {
54: base.InitializeBorder();
55:
56: this.Border.BorderColor = Color.Yellow;
57: this.Border.BorderWidth = 2f;
58: this.Border.CornerRound = 4;
59: }
60:
61: protected override void InitializeStyles()
62: {
63: this.SetStyle(ControlStyles.Selectable, true);
64:
65: base.InitializeStyles();
66: }
67:
68: protected override void InitializeSelf()
69: {
70: base.InitializeSelf();
71:
72: this.Name = "CheckBox";
73: this.MinimumSize = new Size(24, 24);
74: this.Text = "CheckBox";
75:
76: Graphics g = Graphics.FromHwnd(Handle);
77: Size txtSize = g.MeasureString(Text, Font).ToSize();
78:
79: this.MinimumSize = new Size(txtSize.Width + 28, 24);
80:
81: g.Dispose();
82:
83: this.Size = this.MinimumSize;
84: }
85:
86: protected override void OnMouseClick(System.Windows.Forms.MouseEventArgs e)
87: {
88: if (e.Button == MouseButtons.Left)
89: {
90: //this.isFocused = true;
91:
92: Checked = !Checked;
93: }
94:
95: base.OnMouseClick(e);
96: }
97:
98: protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs e)
99: {
100: //base.OnPaintBackground(e);
101:
102: if (!Visible)
103: {
104: return;
105: }
106:
107: Graphics g = e.Graphics;
108: g.SmoothingMode = SmoothingMode.AntiAlias;
109:
110: g.Clear(BackColor);
111: }
112:
113: protected override void OnPaintBorder(System.Windows.Forms.PaintEventArgs e)
114: {
115: //base.OnPaintBorder(e);
116:
117: if (!Visible)
118: {
119: return;
120: }
121:
122: Graphics g = e.Graphics;
123: g.SmoothingMode = SmoothingMode.AntiAlias;
124:
125: Rectangle radioRect = new Rectangle(
126: 2, (int)((Height - 18 + Border.BorderWidth) / 2),
127: (int)(18 - Border.BorderWidth), (int)(18 - Border.BorderWidth));
128: GraphicsPath radioPath = DrawHelper.CreateRoundRectangle(radioRect, Border.CornerRound);
129:
130: Pen borderPen = new Pen(new SolidBrush(Border.BorderColor),
131: Border.BorderWidth);
132:
133: g.DrawPath(borderPen, radioPath);
134:
135: if (radioPath != null) { radioPath.Dispose(); }
136: }
137:
138: protected override void OnPaintContent(System.Windows.Forms.PaintEventArgs e)
139: {
140: //base.OnPaintContent(e);
141:
142: if (!Visible)
143: {
144: return;
145: }
146:
147: Graphics g = e.Graphics;
148: g.SmoothingMode = SmoothingMode.AntiAlias;
149:
150: Size txtSize = g.MeasureString(Text, Font).ToSize();
151:
152: PointF txtLocation = new PointF(24, (Height - txtSize.Height) / 2);
153: //是否可用
154: if (Enabled)
155: {
156: //检测Text属性是否为空
157: if (!Utils.IsNullorEmpty(Text))
158: {
159: g.DrawString(Text, Font, new SolidBrush(ForeColor), txtLocation);
160: //焦点
161: if (Focused)
162: {
163: Point txtLocal = new Point(24, (int)((Height - txtSize.Height) / 2));
164: Rectangle txtRect = new Rectangle(txtLocal, txtSize);
165: txtRect.Width -= 2;
166: ControlPaint.DrawFocusRectangle(g, txtRect);
167: }
168: }
169: //是否选中
170: if (Checked)
171: {
172: GraphicsPath checkedPath = new GraphicsPath(FillMode.Winding);
173: checkedPath.AddLine(new Point(2, Height / 2), new Point(10, Height / 2 + 8));
174: checkedPath.AddLine(new Point(19, (Height - 18) / 2), new Point(18, (Height - 18) / 2));
175: checkedPath.AddLine(new Point(18, (Height - 18) / 2), new Point(9, Height / 2 + 2));
176: checkedPath.AddLine(new Point(9, Height / 2 + 2), new Point(2, Height / 2));
177: checkedPath.CloseFigure();
178:
179: g.FillPath(new SolidBrush(Border.BorderColor), checkedPath);
180:
181: if (checkedPath != null) { checkedPath.Dispose(); }
182: }
183: }
184: else
185: {
186: //检测Text属性是否为空
187: if (!Utils.IsNullorEmpty(Text))
188: {
189: txtLocation.X++;
190: txtLocation.Y++;
191: g.DrawString(Text, Font, new SolidBrush(Color.White), txtLocation);
192: txtLocation.X--;
193: txtLocation.Y--;
194: g.DrawString(Text, Font, new SolidBrush(Color.FromArgb(128, 128, 128)), txtLocation);
195: }
196: }
197: }
198: }
199: }