代码之家  ›  专栏  ›  技术社区  ›  Billy

我将图像绘制到窗体,但它仅限于窗体的左上角

  •  0
  • Billy  · 技术社区  · 7 年前

    我在参考资料中创建了一个表单并导入了两个保存为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 回复  |  直到 3 年前
        1
  •  0
  •   Jimi    7 年前

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

    这些财产, Me.FormBorderStyle = FormBorderStyle.None Me.WindowState = FormWindowState.Maximized 最好在设计器中设置。
    没有理由让他们 Form.Load() 事件他们的状态甚至不受任何条件的限制。
    一般来说,尽可能轻量级地保留窗体的加载事件,并避免设置可能导致级联事件的属性。

    例如:

    定义用于存储图像的对象:
    (The 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
    

    某处(甚至在 类型加载() ),用位图填充列表:
    (此处,位图大小设置为原始大小,但您可以将其设置为您认为合适的任何尺寸)。

    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 完成所有绘画:
    (请注意,除非 绘图位图 标志设置为 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()