1.    using System;
2.    using System.Windows.Forms; 
3.    using System.Drawing; 
4.    using System.Collections; 
5.
6.    namespace PocketDice 
7.    { 
8.
9.         public enum ScoringBoxState 
10.        { 
11.            NotScoring, 
12.            Scoring, 
13.            Locked 
14.        } 
15.
16.        public class PocketDiceEventArgs 
17.        { 
18.        } 
19.
20.        public delegate void PocketDiceEventHandler(object sender, 
PocketDiceEventArgs e); 
21.        public delegate int ScoringHandler(SingleDie[] dice); 
22.
23.        public class ScoringBox:System.Windows.Forms.Control 
24.        { 
25.
26.            public event PocketDiceEventHandler ScoreClick; 
27.            public void OnScoreClick(PocketDiceEventArgs e) 
28.            { 
29.                if (ScoreClick != null) 
30.                       ScoreClick(this, e); 
31.            } 
32.
33.            private SolidBrush _brushTextLocked = new 
SolidBrush(Color.DarkGray); 
34.            private SolidBrush _brushTextNotScoring = new 
SolidBrush(Color.DarkBlue); 
35.            private SolidBrush _brushTextScoring = new 
SolidBrush(Color.Black); 
36.
37.            private SolidBrush _brushFillLocked = new 
SolidBrush(Color.LightGoldenrodYellow);
38.            private SolidBrush _brushFillNotScoring = new 
SolidBrush(Color.LightGray); 
39.            private SolidBrush _brushFillScoring = new 
SolidBrush(Color.White); 
40.    
41.            private Pen _outlinePenLocked = new Pen(Color.LightGray); 
42.            private Pen _outlinePen = new Pen(Color.Black); 
43.            private Pen _outlinePenScoring = new Pen(Color.Gray); 
44.
45.            private Font _font = new Font("Tahoma", 9, 
FontStyle.Regular); 
46.
47.            private int _labelLeftOffset = 6; 
48.            private int _pointsRightOffset = 6; 
49.            private int _labelTopOffset = 2; 
50.    
51.            private int _scoreValue = 0; 
52.            private ScoringBoxState _state = 
ScoringBoxState.NotScoring; 
53.            private ScoringHandler _scoreForDiceHandler; 
54.
55.            public int ScoreValue 
56.            { 
57.                get {return _scoreValue;} 
58.                set {_scoreValue = value;} 
59.            } 
60.
61.            public ScoringBoxState State 
62.            { 
63.                get {return _state;} 
64.                set {_state = value;} 
65.            } 
66.
67.            public ScoringHandler ScoreForDiceHandler 
68.            { 
69.                get {return _scoreForDiceHandler; } 
70.                set {_scoreForDiceHandler = value;} 
71.            } 
72.
73.            public void Initialize() 
74.            { 
75.                _scoreValue=0; 
76.                _state = ScoringBoxState.NotScoring; 
77.            } 
78.
79.
80.            public ScoringBox() 
81.            { 
82.                // 
83.                // TODO:ӹ߼ 
84.                // 
85.            } 
86.
87.            public ScoringBox(string label, int left, int top, int width, int height, ScoringHandler scorer) 
88.            { 
89.                this.Text = label; 
90.                this.Left = left; 
91.                this.Width = width; 
92.                this.Top = top; 
93.                this.Height = height; 
94.                this.ScoreForDiceHandler = scorer; 
95.            } 
96.
97.            protected override void OnMouseDown(MouseEventArgs e) 
98.            { 
99.                // ÷ScoreClick;Ҫ 
100.           if (this._state == ScoringBoxState.Scoring) 
101.           { 
102.               // ÷ַ 
103.               this._state = ScoringBoxState.Locked; 
104.               this.Invalidate(); 
105.               // ¼ʹ֪ 
106.               PocketDiceEventArgs args = new PocketDiceEventArgs();
107.               this.OnScoreClick(args); 
108.           } 
109.    } 
110.
111.
112.    protected override void OnPaint(PaintEventArgs e) 
113.    { 
114.         base.OnPaint (e); 
115.
116.         Graphics g = e.Graphics; 
117.         Rectangle rect = this.ClientRectangle; 
118.         rect.Width--; 
119.         rect.Height--; 
120.
121.         // ǩҪ 
122.         SizeF pointsSize = g.MeasureString(_scoreValue.ToString(), 
_font); 
123.             float pointsLeft = rect.Right - 
_pointsRightOffset -pointsSize.Width; 
124.
125.             // ״̬Ƿ϶ 
126.
127.             if (this.Enabled == false) 
128.             { 
129.                 // Ϊȡ϶ı 
130.                 g.DrawString(this.Text, _font, this._brushText
Locked, rect.Left + _labelLeftOffset, rect.Top + _labelTopOffset); 
131.             } 
132.             else 
133.             { 
134.                 switch (_state) 
135.                 { 
136.                     case ScoringBoxState.NotScoring: 
137.                         // ϶ǩǷ . 
138.                         g.FillRectangle(this._brushFillNotScoring, 
rect); 
139.                         g.DrawRectangle(_outlinePen, rect); 
140.                         g.DrawString(this.Text,  _font, 
this._brushTextNotScoring,  rect.Left  +  _labelLeftOffset,  rect.Top  + _labelTopOffset);
141.                         break;
142.                     case ScoringBoxState.Scoring:
143.                         // ϶ǩǱڵķ
144.                         g.FillRectangle(this._brushFillScoring,
 rect);
145.                         g.DrawRectangle(_outlinePenScoring, rect);
146.                         g.DrawString(this.Text, _font, 
this._brushTextScoring, rect.Left + _labelLeftOffset, rect.Top + _label
TopOffset);
147.                         g.DrawString(_scoreValue.ToString(), _font, 
this._brushTextScoring, pointsLeft, rect.Top + _labelTopOffset);
148.                         break;
149.                     case ScoringBoxState.Locked:
150.                         // ϶ǩͱ÷
151.                         g.FillRectangle(this._brushFillLocked, 
rect); 
152.                         g.DrawRectangle(_outlinePenLocked, rect); 
153.                         g.DrawString(this.Text, _font, 
this._brushTextLocked,rect.Left + _labelLeftOffset, rect.Top + _labelTopOffset); 
154.                        g.DrawString(_scoreValue.ToString(), _font, 
this._brushTextLocked, pointsLeft, rect.Top + _labelTopOffset); 
155.                        break; 
156.                } 
157.            } 
158.        } 
159.
160.        public void SetNotScoring() 
161.        { 
162.            // ÷״̬õNotScoring 
163.            if (this.State != ScoringBoxState.Locked) 
164.            { 
165.                this.State = ScoringBoxState.NotScoring; 
166.                this.ScoreValue = 0; 
167.                this.Invalidate(); 
168.            } 
169.        } 
170.
171.        public void SetScoring(SingleDie[] dice) 
172.        { 
173.            // ״̬õNotScoring 
174.            if (this.State != ScoringBoxState.Locked) 
175.            { 
176.               this.State = ScoringBoxState.Scoring; 
177.               if (this.ScoreForDiceHandler != null) 
178.                   this.ScoreValue = 
this._scoreForDiceHandler(dice);
179.               this.Invalidate(); 
180.            } 
181.        } 
182.    } 
183.  } 
