【问题标题】:Use Paint event inside of a class在类中使用 Paint 事件
【发布时间】:2015-11-13 16:43:07
【问题描述】:

我正在尝试在一个类中创建一个可以绘制扑克牌的函数。我还在掌握在 Winforms 中绘图,所以请耐心等待。

到目前为止的基本类如下所示:

Public Class Card
    Public Suit As Char
    Public Value As String
    Public Sub New(_Suit As Char, _Value As String)
        Suit = _Suit
        Value = _Value
    End Sub
    Public Sub Draw()

    End Sub
End Class

在 Card 类中,我想创建一个子 Draw,它绘制一个白色矩形,添加数字、西装符号等。我有绘制白色矩形的代码,但我不知道如何使其适应在类中使用。我只有这个事件处理程序:

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    Dim p As Pen
    p = New Pen(Color.Black, 2)
    Dim rekt = New Rectangle(New Point(10, 10), New Size(90, 126))
    Me.CreateGraphics.DrawRectangle(p, rekt)
    CreateGraphics.FillRectangle(Brushes.White, rekt)
End Sub

这会在表单加载时自动创建一个白色矩形。当我将此事件处理程序中的代码 C&P 到 Draw 函数中时,它不起作用,因为 CreateGraphics 不是 Card 类的成员。

是否有一个简单的解决方案,或者我应该从根本上解决这个问题?

【问题讨论】:

  • 除非这是学习练习,否则您可以store the deck in an imagelist and load them from there。 CreateGraphics 几乎从来都不是正确的做法。使用由绘制事件提供的图形对象。将 e.Graphics 传递给 Card.Draw,卡片可以自己绘制
  • ...同样对于通用 Card 类,它们将具有 Suit、Rank 和 Value。在 BlackJack 和 Baccarat(以及 Euchre 等其他游戏)中,某些牌的价值与排名不同
  • 我不明白价值和排名可能是不同的东西,但我目前不打算编写一个我需要担心的游戏:)。
  • 使用图像更有意义,我只是想看看以编程方式绘制的卡片是否可行。您能否更详细地解释使用图形对象并传递 e.Graphics 的含义?我真的不明白这在代码方面意味着什么。
  • 嗯,在二十一点中,杰克值 10,但等级仍然是 11/J;在百家乐中,它仍然是 Jack,但值为 0。查看在绘制事件中传递的参数:e As PaintEventArgs 它为您提供了一个图形对象

标签: vb.net class visual-studio-2012 event-handling


【解决方案1】:

从图像列表中load pre-done images 会容易得多,因此适当的图像可以是另一个Card 属性。否则,您可能会进入绘制心形和俱乐部形状(或更改字体以使用 WebDings 或 CardFace font 或绘制西装符号的位图)之类的事情。

虽然您的卡片可以自己绘制,但您想使用 Windows 在绘画事件中提供的 Graphics 对象:

myCard = New Card("Diamonds", 6)

Private Sub pb_Paint(sender As Object, e As PaintEventArgs) Handles pb.Paint
    myCard.Draw(e.Graphics)
End Sub

e 是在绘画事件中传递给您的PaintEventArgs。它是一个类,其中一个成员是 Graphics 对象。 Card.Draw()方法:

Public Sub Draw(g As Graphics)

    Dim br As Brush = Brushes.Black
    If Suit.ToLowerInvariant = "hearts" Or Suit.ToLowerInvariant = "diamonds" Then
        br = Brushes.Red
    End If

    Using p As New Pen(Color.Black, 2)
        Dim rekt = New Rectangle(New Point(10, 10), New Size(90, 126))
        g.DrawRectangle(p, rekt)
        g.FillRectangle(Brushes.White, rekt)

        Using f As New Font("Verdana", 16, FontStyle.Bold)
            g.DrawString(Rank.ToString & " " & Suit(0), f, br, New Point(12, 12))
        End Using
    End Using

End Sub

输出(非常粗略!):

还请注意,我正在处理创建的 Pen。如果需要解释,Suit(0) 表示字符串的第一个字符。

【讨论】:

  • 谢谢,这真的很有帮助!我稍后会试试这个。
  • 我决定采用您建议的图像路线,因为它变得不必要地复杂。但这仍然很有帮助。
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多