标签:com led 定时 int 解决办法 eve 没有 htm graphics
上次写的随笔,简单21点纸牌小游戏,当窗体大小改变时,纸牌画面会出现不显示的问题,因为每一张牌都是用GDI+的方法,从图片中剪裁下来的,没有用到vs提供的控件,如PictureBox控件,这就需要自己在窗体的Paint事件中来重新绘制图片,这样在窗体大小改变时,就能够正常显示纸牌图片了,代码中纸牌父类PKFather中的x,y参数,提供的就是纸牌在窗体中的实际坐标,也就是每张纸牌类要在窗体中显示时,都已经提供了在窗体上的坐标,那么问题解决就简单了,将需要在窗体上显示的那几张牌另外创建个集合,这个集合只要不为空,就在paint事件调用,这样在窗体大小改变时就能重新绘制纸牌了。代码如下
public partial class Form1 : Form //程序开始部分定义用来存储需要显示的牌 private List<RPoker> pCard = new List<RPoker>(); private void Form1_Paint(object sender, PaintEventArgs e) { if (pCard.Count > 0) { foreach (var item in pCard) { item.Draw(e.Graphics); } } } private void button1_Click(object sender, EventArgs e)//开始游戏 { pCard.Clear(); this.Refresh(); button1.Enabled = false; label1.Text = ""; label2.Text = ""; label1.Refresh(); label2.Refresh(); computerNumber = 0; playerNumber = 0; playerCount = 0; computerCount = 0; //画玩家第一张牌 allCard[TopCard].X = 200; allCard[TopCard].Y = 200; allCard[TopCard].Draw(this.CreateGraphics()); pCard.Add(allCard[TopCard]);//要显示牌加入集合 if (allCard[TopCard].Rank > Rank.Ten) { playerCount += 10; playerNumber += 1; } else { playerCount += (int)allCard[TopCard].Rank; playerNumber += 1; } TopCard++; if (TopCard >= 54) { Shuffle(); MessageBox.Show("新的一副牌!!"); } label2.Text = playerCount.ToString(); label2.Refresh(); label3.Text = playerNumber.ToString(); label3.Refresh(); //画计算机第一张牌 allCard[TopCard].X = 200; allCard[TopCard].Y = 40; allCard[TopCard].Draw(this.CreateGraphics()); pCard.Add(allCard[TopCard]);//要显示牌加入集合 if (allCard[TopCard].Rank > Rank.Ten) { computerCount += 10; computerNumber += 1; } else { computerCount += (int)allCard[TopCard].Rank; computerNumber += 1; } TopCard++; if (TopCard >= 54) { Shuffle(); // pCard.Clear(); MessageBox.Show("新的一副牌!!"); } label1.Text = computerCount.ToString(); label1.Refresh(); label4.Text = computerNumber.ToString(); label4.Refresh(); //画玩家第二张牌 allCard[TopCard].X = 225; allCard[TopCard].Y = 200; allCard[TopCard].Draw(this.CreateGraphics()); pCard.Add(allCard[TopCard]);//要显示牌加入集合 if (allCard[TopCard].Rank > Rank.Ten) { playerCount += 10; playerNumber += 1; } else { playerCount += (int)allCard[TopCard].Rank; playerNumber += 1; } TopCard++; if (TopCard >= 54) { Shuffle(); MessageBox.Show("新的一副牌!!"); } label2.Text = playerCount.ToString(); label2.Refresh(); label3.Text = playerNumber.ToString(); label3.Refresh(); //画计算机第二张牌 allCard[TopCard].X = 225; allCard[TopCard].Y = 40; allCard[TopCard].Draw(this.CreateGraphics()); pCard.Add(allCard[TopCard]);//要显示牌加入集合 if (allCard[TopCard].Rank > Rank.Ten) { computerCount += 10; computerNumber += 1; } else { computerCount += (int)allCard[TopCard].Rank; computerNumber += 1; } TopCard++; if (TopCard >= 54)// { Shuffle(); MessageBox.Show("新的一副牌!!"); } label1.Text = computerCount.ToString(); label1.Refresh(); label4.Text = computerNumber.ToString(); label4.Refresh(); button2.Enabled = true; button3.Enabled = true; }
其它地方的代码,只要是需要显示的牌,都加入到pCard集合中,当然还要在开始游戏的代码开头处加入pCard.Clear(),每次开始游戏前清空下集合,不然窗体显示的就不一定是本轮的纸牌。
其实同一个问题,也可以有多种解法,在网上看到也有用Timer控件,来定时刷新窗体重新绘制的方法,使用这种方法要定义一个开关项,不然定时刷新重绘,窗体会不断闪烁,开关项的定义也比较繁琐,不过也是一种解决办法,如果还有更好的方法,也请大家指教。
标签:com led 定时 int 解决办法 eve 没有 htm graphics
原文地址:https://www.cnblogs.com/chonglang/p/9750012.html