Moduler>GUI-komponenter>Kortstokk
Kortstokk
Vi definerer en subklasse til button:
class Card : Button { static String BACKSIDE="b2fv"; String m_ResID; int m_CID; Boolean m_FrontIsUp; Point m_hitPoint = new Point(0, 0); static String[] m_Suites = { "Kløver", "Spar", "Hjerter", "Ruter" }; static String[] m_Rank = { "Ess", "Konge", "Dame", "Knekt", "10","9","8","7","6","5","4","3","2" }; public Card(int id) { m_CID = id; m_ResID="_" + (id + 1); m_FrontIsUp = false; } public void ShowFace(Boolean front) { m_FrontIsUp = front; if (m_FrontIsUp) Image = (Image)Properties.Resources.ResourceManager.GetObject(m_ResID); else Image = (Image)Properties.Resources.ResourceManager.GetObject(BACKSIDE); } public Boolean FaceUp { get { return m_FrontIsUp; } } public Point HitPoint { get{return m_hitPoint;} set{m_hitPoint=value;} } public String Suite { get { return m_Suites[m_CID % 4]; } } public String Rank { get { return m_Rank[m_CID / 4]; } } }
I selve formen setter vi opp de 52 kortene i en List<Button> cardDeck når Formeen initialiseres
private void setUpCardButtons() { for (int ix = 0; ix < 52; ix++) { Card b = new Card(ix); b.Location = new Point(5, 5); b.Name = "Card"+(ix+1); b.Size = new Size(72, 96); b.TabIndex = ix+1; b.UseVisualStyleBackColor = true; b.Visible = true; b.Parent = splitContainer1.Panel2; b.MouseDown += new System.Windows.Forms.MouseEventHandler(this.card_press); b.MouseUp += new System.Windows.Forms.MouseEventHandler(this.card_up); b.MouseMove += new System.Windows.Forms.MouseEventHandler(this.card_move); b.ShowFace(false); cardDeck.Add(b); } }
Vi har 4 eventhandlere: 1 for å fordele kortene tilfeldig på formen(buttonDeal_Click), og en for henholdsvis mousedown(card_press), mouseup(card_up) og mousemove(card_move) på et kort.
private void buttonDeal_Click(object sender, EventArgs e) { Random r = new Random(DateTime.Now.Millisecond); foreach (Button b in cardDeck) { int left = r.Next(0, b.Parent.Width - b.Width-2); int top = r.Next(0, b.Parent.Height - b.Height-2); b.Location = new Point(left, top); } } private void card_press(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { movingButton = (Button)sender; movingButton.Capture = true; movingButton.BringToFront(); ((Card)sender).HitPoint=new Point(e.X,e.Y); this.Cursor = Cursors.Hand; } } private void card_up(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { ((Button)sender).Capture = false; movingButton = null; this.Cursor = Cursors.Default; } else { ((Card)sender).ShowFace(!((Card)sender).FaceUp); ((Card)sender).BringToFront(); labelCard.Text = ((Card)sender).Suite + " " + ((Card)sender).Rank; } } private void card_move(object sender, MouseEventArgs e) { if (movingButton != null) { int left = movingButton.Location.X + e.X-((Card)movingButton).HitPoint.X; int top = movingButton.Location.Y + e.Y - ((Card)movingButton).HitPoint.Y; if (left > movingButton.Parent.Width - movingButton.Width) left = movingButton.Parent.Width - movingButton.Width - 2; if (left < 0) left = 2; if (top > movingButton.Parent.Height - movingButton.Height) top=movingButton.Parent.Height - movingButton.Height-2; if (top < 0) top = 2; movingButton.Location = new Point(left, top); } } }