【问题标题】:How to save location of movable button in visual basic winform?如何在visual basic winform中保存可移动按钮的位置?
【发布时间】:2022-01-29 03:08:13
【问题描述】:

我有一个可移动的按钮。一旦鼠标向上事件,新位置就会保存在我的设置中。当我移动按钮时,有时按钮会消失,我重新运行后,它会完全消失。

如何在关闭应用前保存按钮位置?

Public Class Form1
    Dim x, y As Integer
    Dim newpoint As New Point


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        If My.Settings.button1_x70123454440211bghff > 0 Or My.Settings.button1_y70123454440211bghff > 0 Then
            Me.Button1.Location = New Point(My.Settings.button1_x70123454440211bghff, My.Settings.button1_y70123454440211bghff)
        End If
    End Sub

    Private Sub Button1_MouseMove(sender As Object, e As MouseEventArgs) Handles Button1.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then

            newpoint = Control.MousePosition
            newpoint = Control.MousePosition
            newpoint.X -= x
            newpoint.Y -= y
            Button1.Location = newpoint
        End If
    End Sub

    Private Sub Button1_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown
        x = Control.MousePosition.X - Button1.Location.X
        y = Control.MousePosition.Y - Button1.Location.Y
    End Sub

    Private Sub Button1_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp
        My.Settings.button1_x70123454440211bghff = x
        My.Settings.button1_y70123454440211bghff = y
        My.Settings.Save()
    End Sub

    Private Sub Form1_Closed(sender As Object, e As EventArgs) Handles Me.Closed
        My.Settings.richtextbox1 = RichTextBox1.Text
    End Sub
End Class

【问题讨论】:

  • 您正在将xy 保存到您的设置中。这些变量实际上代表什么?当然不是Button 的位置,那你为什么要保存它们呢?如果您想保存Button 的位置,请实际执行此操作,即保存LeftTop 属性值。
  • 您必须阻止用户将按钮移出窗口。针对 0 和 Me.ClientSize.Width - Button1.Width 进行测试,高度相同。这会产生有趣的鼠标问题,因此最好使用布尔变量取消移动。
  • Form_LoadIf My.Settings.button1_x70123454440211bghff > 0 Or My.Settings.button1_y70123454440211bghff > 0 Then 应该是And
  • 确保设置范围为用户。

标签: vb.net


【解决方案1】:

按照this answer 移动按钮,并添加一些检查以将控件保留在其父容器中。对于设置,我喜欢保持简单,并会利用 Visual Studio 在设置中存储结构的能力,因此我将使用 System.Drawing.Point

现在你问“如何在我关闭应用程序之前保存按钮位置?”好吧,您可以在 Form_Close 中执行此操作,或者在 MouseUp 事件中执行此操作。既然你在 MouseUp 中做,我也会做同样的事情。我将加载Form_Load中的最后一个位置

Public Class Form1
    Private initialCursorPosition As System.Drawing.Point
    Private intialButtonPosition As System.Drawing.Point
    Private buttonIsMoving As Boolean = False

    Private Sub Button1_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown
        Dim b = DirectCast(sender, Button)
        initialCursorPosition = System.Windows.Forms.Cursor.Position
        intialButtonPosition = b.Location
        buttonIsMoving = True
    End Sub

    Private Sub Button1_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp
        buttonIsMoving = False
        My.Settings.Button1Location = DirectCast(sender, Button).Location
    End Sub

    Private Sub Button1_MouseMove(sender As Object, e As MouseEventArgs) Handles Button1.MouseMove
        If buttonIsMoving Then
            Dim b = DirectCast(sender, Button)
            Dim newX = intialButtonPosition.X - (initialCursorPosition.X - Cursor.Position.X)
            Dim newY = intialButtonPosition.Y - (initialCursorPosition.Y - Cursor.Position.Y)
            newX = Math.Max(Math.Min(newX, b.Parent.ClientSize.Width - b.Width), 0)
            newY = Math.Max(Math.Min(newY, b.Parent.ClientSize.Height - b.Height), 0)
            b.Location = New Point(newX, newY)
        End If
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Button1.Location = My.Settings.Button1Location
    End Sub
End Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多