在 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)
表示字符串的第一个字符。
我正在尝试在 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)
表示字符串的第一个字符。