我把图像画成形式,但它仅限于形式的左上角



我已经创建了一个表单,并在资源中导入了两个保存为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.NoneMe.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()

相关内容

最新更新