Visual Basic 辅助窗体滑过主窗体,滑出主窗体,不关闭

Visual Basic secondary form slide over main, slide off main, not closing

提问人:Valkyro 提问时间:10/31/2023 最后编辑:Valkyro 更新时间:11/1/2023 访问量:98

问:

我一直在为一些不同的事情创建一个 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

vb.net WinForms 用户窗体

评论

0赞 jmcilhinney 10/31/2023
在将标签应用于问题之前,请阅读标签的描述。您的 VS 标记不适用,并且两者都明确不将它们用于代码问题。人们观看标签是有原因的。你实际上是在欺骗他们阅读与他们无关的问题。这是一个专门的 WinForms 问题,您没有添加该标签。
0赞 Valkyro 10/31/2023
对不起,我很抱歉。我从未在 Stack Overflow 上发帖,只是想尝试获得我能得到的任何帮助。我在使用 Visual Studio 时附加了 VS,因此认为它是相关的,对于混淆,我深表歉意。
0赞 Jimi 10/31/2023
您可以使用该函数来实现此目的。请参阅此处:如何向 ContextMenuStrip 添加自定义动画?。这会将不同的动画(请参阅代码)应用于 ContextMenuStrip。当然,您可以将相同的效果/过渡应用于任何其他窗口(具有句柄)。在此示例中,您可以定义动画所需的时间以及要应用的效果类型。包括滑动效果AnimateWindow
0赞 Idle_Mind 10/31/2023
循环似乎不太对劲。那不是永远运行吗......?我想你会想要更像的东西.Do WhiletmrContact2Do While Me.Left <= Screen.PrimaryScreen.Bounds.Width - 10
0赞 Valkyro 10/31/2023
嘿 Jimi,AnimateWindow 应该可以完美运行,但是我现在遇到的问题是,表单不是在右侧向左滑动直到它出现在屏幕上,它只是展开并出现在按钮所在的位置。我认为我没有正确编码 xD 我会用我使用的代码更新帖子。

答:

0赞 Valkyro 11/1/2023 #1

我整个下午/晚上都在研究这个程序,试图想出一个解决方案。幸运的是,我能够弄清楚。在下面的代码中,当加载联系表单时,属性会设置其颜色,以及表单的位置/大小以及它相对于主表单的位置();此外,表单被带到前面,并在动画中与滑动一起显示。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