Button
Børre Stenseth
Moduler>GUI-komponenter>Kortstokk

Kortstokk

Hva
screen
Spillkort som buttons

Vi vil lage en kortstokk basert på buttons. Det vil si at vi lager 52 forekomster av en egendefinert subklasse til button.

Kortbildene er hentet fra [1] . Bildene legges inn som properties.

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);
        }
    }
}
Referanser
  1. Playing Cardsjfitz.comwww.jfitz.com/cards/24-01-2011
  • Prosjektet:
    https://svn.hiof.no/svn/psource/Csharpspikes/cards
Vedlikehold

B. Stenseth, januar 2011

(Velkommen) Moduler>GUI-komponenter>Kortstokk (Tekstformat)