提问人:Valkyro 提问时间:10/31/2023 最后编辑:Valkyro 更新时间:11/1/2023 访问量:98
Visual Basic 辅助窗体滑过主窗体,滑出主窗体,不关闭
Visual Basic secondary form slide over main, slide off main, not closing
问:
我一直在为一些不同的事情创建一个 Visual Basic Win 应用程序。 我想添加的是将主窗体放在背景中,当单击侧边按钮时,如下图所示“联系人”,“联系人”窗体从屏幕右侧向左滑动。一旦完全打开,它就会停止并可以与之交互。这一切都有效。 我的问题是,当按下“X”按钮(代表关闭)时,我希望表单滑出屏幕然后关闭而不是保持打开状态。
我已经能够让表格滑出屏幕。我也能够关闭表格。但是,我无法让它滑出屏幕然后关闭。 下面是该表单的一些图像,以及我在 frmContact 表单上的“X”按钮的代码。 我在动画中使用了计时器滴答声。 我已经看到其他人使用带有 psTimerFunc 和 piCount 的“DOWN”函数制作了这样的东西,但是当我更改它以使其适合我的应用程序时,它不起作用。 (我还想提一下,我在Visual Basic方面没有做太多事情,这是我在玩/测试我可以做的事情,任何帮助或提示都值得赞赏)
以下是加载表单的代码,当单击“X”按钮时,将表单带到屏幕“tmrContact_Tick”,然后将表单从屏幕上移开(不起作用)“tmrContact2”:
Sub LoadForm(MessageDescription As String)
Me.Top = 0
Me.Left = Screen.PrimaryScreen.Bounds.Width
Me.TopMost = True
Me.BringToFront()
Me.Show()
tmrContact.Enabled = True
End Sub
Private Sub btnX_Click(sender As Object, e As EventArgs) Handles btnX.Click
tmrContact2.Enabled = True
End Sub
Private Sub tmrContact_Tick(sender As Object, e As EventArgs) Handles tmrContact.Tick
Me.Left = Me.Left - 5
If Me.Left + Me.Width <= Screen.PrimaryScreen.Bounds.Width + 10 Then
tmrContact.Enabled = False
End If
End Sub
Private Sub tmrContact2_Tick(sender As Object, e As EventArgs) Handles tmrContact2.Tick
Do While Me.Left + Me.Width >= Screen.PrimaryScreen.Bounds.Width - 10
Me.Left = Me.Left + 1
Application.DoEvents() ' Allow the application to process other events
Loop
tmrContact2.Enabled = False
Me.Close()
End Sub
更新:
我已经根据用户“Jimi”使用 AnimateWindows 的一些建议内联更新了代码。以下是我能够组合在一起并开始工作的一些代码,我已经手动选择了联系表单的起始位置,所以现在当我单击打开联系表单时,它确实从右到左滑动到屏幕上,它不是很干净,但它现在可以,但是当我单击 X 按钮时, 它不会从左到右,它只是关闭。 代码如下:
导入 System.Runtime.InteropServices
公共类 frmContact <DllImport(“user32.dll”)> 私有共享函数 AnimateWindow(ByVal hWnd As IntPtr, ByVal time As Integer, ByVal flags As Integer) As Boolean End 函数
Private Sub frmContact_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AnimateWindow(Me.Handle, 100, &H2)
End Sub
Private Sub btnX_Click(sender As Object, e As EventArgs) Handles btnX.Click
AnimateWindow(Me.Handle, 100, &H1)
End Sub
End 类
下面是一个未列出的 YT 视频链接,显示了实际问题: https://youtu.be/ocePY2Dl_SY
答:
我整个下午/晚上都在研究这个程序,试图想出一个解决方案。幸运的是,我能够弄清楚。在下面的代码中,当加载联系表单时,属性会设置其颜色,以及表单的位置/大小以及它相对于主表单的位置();此外,表单被带到前面,并在动画中与滑动一起显示。frmDDEF
单击“X”后,表单将滑出屏幕;一旦关闭,它就会被送到后面并关闭。这样一来,如果主窗体没有最大化,如果没有 ,您将能够看到窗体静止滑动,然后在它离开屏幕后关闭;这行代码可以防止这种情况发生。Me.SendToBack()
Public Class frmContact
Public Sub LoadForm(MessageDescription As String)
grpCONTACTTOP.BackColor = Color.FromArgb(2, 7, 26)
pnlContact.BackColor = Color.FromArgb(39, 47, 76)
Me.Top = frmDDEF.Top
Me.Left = frmDDEF.Left + frmDDEF.Width ' Appears from the right side of the form
Me.Height = frmDDEF.Height ' Matches the height of Contact with DDEF
Me.TopMost = True
Me.BringToFront()
Me.Show()
tmrContact.Enabled = True
End Sub
Private Sub lblX_Click(sender As Object, e As EventArgs) Handles lblX.Click
tmrContact2.Enabled = True
End Sub
Private Sub tmrContact_Tick(sender As Object, e As EventArgs) Handles tmrContact.Tick ' Move left
Me.Left = Me.Left - 5
If Me.Left + Me.Width <= frmDDEF.Left + frmDDEF.Width + 10 Then
tmrContact.Enabled = False
End If
End Sub
Private Sub tmrContact2_Tick(sender As Object, e As EventArgs) Handles tmrContact2.Tick ' Move right
Me.Left = Me.Left + 5
If Me.Left >= frmDDEF.Left + frmDDEF.Width Then
Me.SendToBack()
tmrContact2.Enabled = False
Me.Close()
End If
End Sub
End Class
评论
AnimateWindow
Do While
tmrContact2
Do While Me.Left <= Screen.PrimaryScreen.Bounds.Width - 10