我将图像绘制成形式,但它仅限于表格

时间:2018-01-30 21:55:16

标签: vb.net graphics drawing

我创建了一个表单并导入了两个保存为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

谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

无法存储图形对象。它经常被删除/更新。你最终会得到一个无效的。它真的没用,你可以说是一个错误 您可以使用使用Control.CreateGraphics()创建的图形对象,但必须记住它不是持久;如果您在其上绘制的Control需要重新绘制()本身(例如,您将某些东西拖过它,如果它是一个Form,当它被最小化等等)时它将被删除。

设计师可以更好地设置这些属性,Me.FormBorderStyle = FormBorderStyle.NoneMe.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()