给你一段我的代码参考。是用vb.net写的。
这段代码用“标题画面”来输入登录用户名和密码,图片做得漂亮一些就可以了。
用返回的DialogResult决定是否加载主窗体。
在模块中写:
    Public Sub Main()
        Dim tmpLogin As New frmLogin()
        tmpLogin.StartPosition = FormStartPosition.CenterScreen
        Dim ret As DialogResult '= DialogResult.OK '= tmpLogin.Showdialog
        '这样导致第二次的Application.Run(gMDIMain)不能驻留窗体。  Application.Run(tmpLogin)
        ret = tmpLogin.ShowDialog()
        ' ret = DialogResult.OK
        ' ret = tmpLogin.DialogResult
        tmpLogin.Dispose()
        tmpLogin = Nothing
        Select Case ret
            Case DialogResult.OK
                gMDIMain = New MDIMain()
                Application.Run(gMDIMain)
            Case DialogResult.Cancel
                Exit Select
            Case Else
                MsgBox("?????????")
                Exit Select
        End Select
    End Sub
注意,在frmLogin中打开数据连接。
这跟你的要求不一致。但是我认为,除了很小的程序或者单机程序及游戏之外,现在做的管理系统都要求系统先检测用户名和密码,所以“标题画面”实际就成了登录界面。
如果你的程序不需要登录,则可在“标题画面”显示的同时,后台调用主窗体的初始化过程,例如用多线程。大概的例子如下:
    (“标题画面”中的代码)
    Private Sub OpenConnectionOnNewThread()
        Dim myThreadStart As New Threading.ThreadStart(AddressOf Me.DoNewThread) '应该是表示此线程开始后执行哪一个过程。
        Dim MyWorkerThread As New Threading.Thread(myThreadStart)
        MyWorkerThread.Name = "新线程"
        MyWorkerThread.Start()
    End Sub
 
    Private Sub DoNewThread() 
        Dim CurrentThread As Threading.Thread = Threading.Thread.CurrentThread
        Dim Message As String = _
            "Thread Name: " + CurrentThread.Name + vbCrLf + _
            "Thread Apartment State: " + CurrentThread.ApartmentState.ToString() + vbCrLf + _
            "Thread State: " + CurrentThread.ThreadState.ToString()
        Console.WriteLine(Message)
        
        '如果无需登录,则在这里调用你的主窗体的初始化过程!
        ’……
    End Sub