我已经创建了一个表单,并在资源中导入了两个保存为PNG文件的方形图像。 当我运行下面的代码时,绘制的黑匣子只会在 X 坐标中大约 200 像素,在 Y 坐标中只有 150 像素从绘制图像的位置开始,之后背景保持白色, 似乎我无法画任何东西,我所做的任何事情都在这一点上画停。
我尝试在屏幕上完全不同的位置重新绘制图像,如果它不在表单左上角的区域内,它将不可见,我也尝试绘制其他图像,但是当它们不在表单的左上角时,它们也不再存在。
我想要的是在整个表单上绘制黑匣子/其他图像,而不仅仅是在左上角,这阻止了我这样做。
Public Class Form1
Dim gameGraphics As System.Drawing.Graphics = Me.CreateGraphics
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Draws black square which I have saved as resource
gameGraphics.DrawImage(My.Resources.black_Background, 0, 80, 1600, 600)
'Draws green square which I have saved as resource
gameGraphics.DrawImage(My.Resources.greenSquare, 2, 82, 40, 40)
End Sub
'makes the form fullscreen
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.FormBorderStyle = FormBorderStyle.None
Me.WindowState = FormWindowState.Maximized
End Sub
'closes form if quitbutton is clicked
Private Sub QuitButton_Click(sender As Object, e As EventArgs) Handles QuitButton.Click
Me.Close()
End Sub
End Class
谢谢你的时间!
无法存储图形对象。它不断被删除/更新。你最终会得到一个无效的。这真的没用,你可以说是一个错误。
您可以使用使用Control.CreateGraphics()
创建的图形对象,但您必须记住它不是持久性的;当您绘制它的控件需要重新 Paint() 本身时,它将被擦除(例如,您在上面拖动某些内容,如果它是一个 Form,当它最小化等)。
这些属性、Me.FormBorderStyle = FormBorderStyle.None
和Me.WindowState = FormWindowState.Maximized
在设计器中设置得更好。
没有理由将它们设置为Form.Load()
事件。他们的状态甚至不受条件的限制。
通常,使窗体的 Load 事件尽可能轻量级,并避免设置可能导致级联事件的属性。
举个例子:
定义一个对象来存储图像:
(DrawBitmaps
标志用于让表单知道何时绘制这些位图)。
Public Class MyBitmap
Public Property Image As Bitmap
Public Property Position As Point
Public Property Size As Size
End Class
Public MyBitmaps As List(Of MyBitmap)
Public DrawBitmaps As Boolean = False
在某处(即使在Form.Load()
中),用位图填充列表:
(在这里,位图大小设置为原始大小,但您可以将其设置为您认为合适的任何尺寸)。
MyBitmaps = New List(Of MyBitmap)
MyBitmaps.Add(New MyBitmap With {.Image = My.Resources.black_Background,
.Position = New Point(0, 80),
.Size = New Size(My.Resources.black_Background.Width,
My.Resources.black_Background.Height)})
MyBitmaps.Add(New MyBitmap With {.Image = My.Resources.greenSquare,
.Position = New Point(2, 82),
.Size = New Size(My.Resources.greenSquare.Width,
My.Resources.greenSquare.Height)})
窗体的 Paint() 事件e.Graphics
执行所有绘制:
(请注意,除非DrawBitmaps
标志设置为True
=>,否则它不会绘制其表面 它在加载/显示时不会绘制这些位图。另一个条件是基本的故障安全。
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
If DrawBitmaps = True AndAlso MyBitmaps.Count > 0 Then
For Each _Item As MyBitmap In MyBitmaps
e.Graphics.DrawImage(_Item.Image, New Rectangle(_Item.Position, _Item.Size))
Next
End If
End Sub
单击Button1
时,表单将绘制位图列表:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
DrawBitmaps = True
Me.Invalidate()
End Sub
在代码中的某个位置,添加新的位图,并告诉 Form 仅使此新位图大小的区域无效:
MyBitmaps.Add(New MyBitmap With {.Image = My.Resources.[AnotherBitmap],
.Position = New Point(50, 50),
.Size = New Size(200, 200)})
Me.Invalidate(New Rectangle(MyBitmaps.Last().Position, MyBitmaps.Last().Size))
从列表中删除位图并重新绘制:
MyBitmaps.RemoveAt(0)
Me.Invalidate()