我创建了一个表单并导入了两个保存为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
谢谢你的时间!
答案 0 :(得分:0)
无法存储图形对象。它经常被删除/更新。你最终会得到一个无效的。它真的没用,你可以说是一个错误
您可以使用使用Control.CreateGraphics()
创建的图形对象,但必须记住它不是持久;如果您在其上绘制的Control需要重新绘制()本身(例如,您将某些东西拖过它,如果它是一个Form,当它被最小化等等)时它将被删除。
设计师可以更好地设置这些属性,Me.FormBorderStyle = FormBorderStyle.None
和Me.WindowState = FormWindowState.Maximized
。
没有理由在Form.Load()
事件中设置它们。它们的状态甚至不受条件限制。
通常,将Form的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)})
Form的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
在代码中的某处,添加一个新的位图并告诉表单只使这个新位图大小的区域无效:
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()