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);
}
}
}












