在 class 中使用 Paint 事件

Use Paint event inside of a class

我正在尝试在 class 中创建一个可以抽牌的函数。我仍在努力掌握在 Winforms 中绘图,请耐心等待。

基本的 class 到目前为止是这样的:

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 class 中,我想创建一个子 Draw,它绘制一个白色矩形,添加数字、花色符号等。我有绘制白色矩形的代码,但是我不知道如何调整它以在 class 中使用。我只有这个事件处理程序:

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 class.

的成员

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

load pre-done images from an imagelist, so the the appropriate image can just be another Card property. Otherwise you could get into things like drawing Heart and Club shapes (or changing fonts to use WebDings or perhaps a 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 是在 paint 事件中传递给你的 PaintEventArgs。它是一个 class,其中一个成员是一个 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) 表示字符串的第一个字符。