1.    using System; 
2.    using System.Drawing; 
3.    using System.Reflection; 
4.    using System.IO; 
5.    using System.Collections; 
6.    using System.Collections.Specialized; 
7.
8.    namespace PocketDice 
9.    { 
10.
11.        public enum PocketDiceSuit 
12.        { 
13.            Spade=0, 
14.            Heart=1, 
15.            Diamond=2, 
16.            Club=3 
17.        } 
18.
19.        public enum PocketDiceValue 
20.        { 
21.            Ace=1, 
22.            Two=2, 
23.            Three=3, 
24.            Four=4, 
25.            Five=5, 
26.            Six=6 
27.        } 
28.
29.        public enum SingleDieState 
30.        { 
31.            Blank=0, 
32.            NotSelected=1, 
33.            Selected=2 
34.        } 
35.
36.        /// <summary> 
37.        /// 
38.        /// </summary> 
39.        public class SingleDie:System.Windows.Forms.Control 
40.        { 
41.            private PocketDiceSuit _suit; 
42.            private PocketDiceValue _value; 
43.            private SingleDieState _state; 
44.            private DiceImages _diceImages; 
45.
46.            private SolidBrush _brushBlankDie = new 
SolidBrush(Color.LightGray); 
47.            private SolidBrush _brushNotSelected = new 
SolidBrush(Color.White); 

48.            private SolidBrush _brushSelected = new 
SolidBrush(Color.LightGray); 
49.
50.            private SolidBrush _brushBlack = new 
SolidBrush(Color.Black); 
51.            private SolidBrush _brushRed = new SolidBrush(Color.Red); 
52.
53.            private Pen _diePen = new Pen(Color.Black); 
54.
55.            private Font _dieFont = new Font("Tahoma", 22, 
FontStyle.Bold); 
56.
57.            private static Random _roller = new Random(); 
58.
59.            public PocketDiceSuit Suit 
60.            { 
61.                get {return _suit;} 
62.                set {_suit = value;} 
63.            } 
64.
65.            public PocketDiceValue Value 
66.            { 
67.                get {return _value;} 
68.                set {_value = value;} 
69.            } 
70.
71.            public SingleDieState State 
72.            { 
73.                get {return _state;} 
74.                set {_state = value;} 
75.            } 
76.
77.            public bool SuitIsBlack 
78.            { 
79.                get{return (_suit == PocketDiceSuit.Club ||
 _suit == PocketDiceSuit.Spade); } 
80.            } 
81.
82.            public bool SuitIsRed 
83.            { 
84.                get{return (_suit == PocketDiceSuit.Diamond || _suit 
== PocketDiceSuit.Heart); } 
85.            } 
86.
87.            public void Roll() 
88.            { 
89.                // ûѡнֵ漴 
90.                if (_state != SingleDieState.Selected) 
91.                { 
92.                    _suit = (PocketDiceSuit)_roller.Next(0,4); 
93.                    _value = (PocketDiceValue)_roller.Next(1,7); 
94.                    _state = SingleDieState.NotSelected; 
95.                    this.Invalidate(); 
96.                } 
97.            } 
98.
99.            public void SetBlank() 
100.           { 
101.               _state = SingleDieState.Blank; 
102.               this.Invalidate(); 
103.           } 
104.
105.
106.            public SingleDie() 
107.            { 
108.                // 
109.                // TODO:ӹ߼
110.                //  
111.            }  
112.     
113.            public SingleDie(DiceImages d, int left, int top, int width, int height) 
114.            { 
115.                _diceImages = d; 
116.                this.Left = left; 
117.                this.Top = top; 
118.                this.Width = width; 
119.                this.Height = height; 
120.            } 
121.
122.            private void PaintValue(Graphics g, Rectangle rect) 
123.            { 
124.                const int kTOP_OFFSET = 0; 
125.                const int kLEFT_OFFSET = 2; 
126.
127.                string s = ""; 
128.                switch (_value) 
129.                { 
130.                    case PocketDiceValue.Ace: s = "A"; break; 
131.                    default: s = ((int) _value).ToString(); break; 
132.                } 
133.
134.                if (this.SuitIsBlack) 
135.                    g.DrawString(s, _dieFont, _brushBlack, 
rect.Left + kLEFT_OFFSET, rect.Top + kTOP_OFFSET); 
136.                else 
137.                    g.DrawString(s, _dieFont, _brushRed, 
rect.Left + kLEFT_OFFSET, rect.Top + kTOP_OFFSET); 
138.            } 
139.
140.            private void PaintSuit(Graphics g, Rectangle rect, bool isSelected) 
141.           { 
142.               const int kTOP_OFFSET = 3; 
143.               const int kLEFT_OFFSET = 18; 
144.
145.               if (isSelected) 
146.               { 
147.                   switch(_suit) 
148.                   { 
149.                       case PocketDiceSuit.Club: 
g.DrawImage(_diceImages.Club_Selected, rect.Left + kLEFT_OFFSET, rect.Top + 
kTOP_OFFSET); break; 
150.                       case PocketDiceSuit.Heart: g.DrawImage
(_diceImages.Heart_Selected, rect.Left + kLEFT_OFFSET, rect.Top + kTOP_OFFSET); break; 
151.                       case PocketDiceSuit.Spade: g.DrawImage
(_diceImages.Spade_Selected, rect.Left + kLEFT_OFFSET, rect.Top + kTOP_OFFSET); break;
152.                       case PocketDiceSuit.Diamond: g.DrawImage
(_diceImages.Diamond_Selected, rect.Left + kLEFT_OFFSET, rect.Top + kTOP_OFFSET); break;
153.                   }
154.               }
155.               else
156.               {
157.                   switch(_suit)  
158.                   {
159.                       case PocketDiceSuit.Club: g.DrawImage
(_diceImages.Club, rect.Left + kLEFT_OFFSET, rect.Top + kTOP_OFFSET); break; 
160.                       case PocketDiceSuit.Heart: g.DrawImage
(_diceImages.Heart, rect.Left + kLEFT_OFFSET, rect.Top + kTOP_OFFSET); break; 
161.                       case PocketDiceSuit.Spade: g.DrawImage
(_diceImages.Spade, rect.Left + kLEFT_OFFSET, rect.Top + kTOP_OFFSET); break; 
162.                       case PocketDiceSuit.Diamond: g.DrawImage
(_diceImages.Diamond, rect.Left + kLEFT_OFFSET, rect.Top + kTOP_OFFSET); break; 163.    } 
164.                   } 
165.               } 
166.
167.               protected override void OnMouseDown
(System.Windows.Forms.MouseEventArgs e) 
168.              {  
169.                   base.OnMouseDown (e);  
170.     
171.                   switch (_state)  
172.                   {  
173.                       case SingleDieState.Blank:  break;  
174.                       case SingleDieState.NotSelected: _state = 
SingleDieState.Selected; break;  
175.                       case SingleDieState.Selected: _state = 
SingleDieState.NotSelected; break;  
176.                   }  
177.                   this.Invalidate();  
178.               }
179.     
180.     
181.               protected override void OnPaint
(System.Windows.Forms.PaintEventArgs e)  
182.               {  
183.                   base.OnPaint (e);  
184.                   Rectangle rect = this.ClientRectangle;  
185.                   rect.Width--;  
186.                   rect.Height--;  
187.                   Rectangle rectInner = new Rectangle(rect.Left + 1, 
rect.Top + 1, rect.Width - 2, rect.Height - 2); 
188.
189.                   switch (_state) 
190.                   { 
191.                       case SingleDieState.Blank: 
192.                           e.Graphics.FillRectangle
(this._brushBlankDie, rect); 
193.                           e.Graphics.DrawRectangle(_diePen, rect); 
194.                           break; 
195.                       case SingleDieState.NotSelected: 
196.                           e.Graphics.FillRectangle
(this._brushNotSelected, rect); 
197.                           PaintValue(e.Graphics, rect); 
198.                           PaintSuit(e.Graphics, rect, false); 
199.                           e.Graphics.DrawRectangle(_diePen, rect); 
200.                           break; 
201.                       case SingleDieState.Selected: 



202.                           e.Graphics.FillRectangle
(this._brushSelected, rect);
203.                           PaintValue(e.Graphics, rect); 
204.                           PaintSuit(e.Graphics, rect, true); 
205.                           e.Graphics.DrawRectangle(_diePen, rect); 
206.                           e.Graphics.DrawRectangle(_diePen, rectInner);
207.                           break; 
208.                       } 
209.
210.                       e.Graphics.DrawRectangle(_diePen, rect); 
211.                   } 
212.
213.        }
214.    } 

