投稿者 るきお  (社会人) 投稿日時 2021/10/20 20:19:44
簡単な方法が2つあります。
1つは、Me.Hide の代わりに Me.Close を使うことです。

Me.Hide はフォームを見えなくしますが、フォームは開いており存在しています。
Me.Close はフォームを閉じます。
既定では、最初のフォームが閉じるとアプリケーションも終了します。

もう1つは、Loadイベントではなく、たとえば、 Shownイベントを使うことです。
ButtonのClickイベントなどの方がもっとふさわしいようにも思います。

Imports System.Drawing.Printing

Public Class Form1

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        PrintDocument1.Print()
    End Sub

    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim rect As New Rectangle(20, 10, 200, 150)
        Dim gradientBrush As New Drawing2D.LinearGradientBrush(rect, Color.Blue, Color.Red, 0)
        e.Graphics.FillRectangle(gradientBrush, 20, 10, 200, 150)
    End Sub

    Private Sub PrintDocument1_EndPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.EndPrint
        Me.Hide()
    End Sub

End Class


新参者さんのプログラムがうまくいかない最大の理由は、Loadイベント発生中にMe.Hide を実行している点です。
通常Loadイベント実行中はまだフォームが表示されていないので、Me.Hideを実行しなくてもフォームは非表示なのです。Loadイベント完了後にフォームが自動的に表示されます。この直後にShownイベントが発生します。

新参者さんのプログラムでは、Loadイベントで印刷を実行して、EndPrintイベントが発生して、Me.Hideが実行されフォームが非表示になるように指示されます。
ここまでは予想通りだと思いますが、その後Loadイベントが完了するので、上述したように自動的にフォームが表示されます。結果としてMe.Hideの指示は無意味となります。