VB如何让无边框窗体 自定义缩放和移动
时间: 2023-03-01 21:48:57 浏览: 114
Visual Basic (VB) 中,可以使用 API 函数和鼠标事件来实现无边框窗体的自定义缩放和移动。
首先,要将窗体的边框样式设置为无边框。接下来,可以使用鼠标事件来监听鼠标移动,从而实现窗体的移动。可以在鼠标按下时记录鼠标的位置,在鼠标移动时更新窗体的位置,以实现移动效果。
同样,可以使用 API 函数来实现窗体的缩放。可以通过捕获鼠标事件,监听鼠标移动,并在鼠标移动时使用 API 函数来改变窗体的大小。
具体实现细节可以参考网上的教程和代码。希望这个回答能够对您有所帮助。
相关问题
VB让无边框窗体实现自定义缩放和移动的具体代码怎么写
可以使用 Windows API 函数来实现自定义缩放和移动无边框窗体。
以下是VB代码示例:
```vb
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessageA Lib "user32" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
ReleaseCapture
SendMessageA Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End If
End Sub
```
在无边框窗体的`Form_MouseDown`事件中添加上述代码,即可实现窗体的自定义移动。
如果想要实现自定义缩放,需要再添加相关的代码实现。
VB 无边框窗体 实现 缩放
要实现无边框窗体的缩放,可以使用以下步骤:
1. 在窗体的属性中将BorderStyle设置为None,即去掉窗体的边框。
2. 添加一个Panel控件,将其Dock属性设置为Fill,使其覆盖整个窗体。
3. 在Panel控件中添加控件,并设置其位置和大小。
4. 使用MouseMove事件处理程序来捕获鼠标的移动事件。
5. 在MouseMove事件处理程序中判断鼠标是否在窗体的边缘,如果是,则改变鼠标的形状为缩放箭头。
6. 如果鼠标在窗体的边缘,则使用API函数来改变窗体的大小。
以下是一个示例代码:
```
Public Class Form1
Private Const WM_NCHITTEST As Integer = &H84
Private Const HTLEFT As Integer = 10
Private Const HTRIGHT As Integer = 11
Private Const HTTOP As Integer = 12
Private Const HTTOPLEFT As Integer = 13
Private Const HTTOPRIGHT As Integer = 14
Private Const HTBOTTOM As Integer = 15
Private Const HTBOTTOMLEFT As Integer = 16
Private Const HTBOTTOMRIGHT As Integer = 17
Private Const BORDER_WIDTH As Integer = 10
Private Const MIN_WIDTH As Integer = 100
Private Const MIN_HEIGHT As Integer = 100
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
Me.DoubleBuffered = True
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Dim panel As New Panel()
panel.Dock = DockStyle.Fill
Me.Controls.Add(panel)
' Add controls to panel here.
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)
If m.Msg = WM_NCHITTEST AndAlso Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None Then
Dim pt As New Point(m.LParam.ToInt32())
pt = Me.PointToClient(pt)
If pt.X < BORDER_WIDTH AndAlso pt.Y < BORDER_WIDTH Then
m.Result = New IntPtr(HTTOPLEFT)
ElseIf pt.X < BORDER_WIDTH AndAlso pt.Y > Me.ClientSize.Height - BORDER_WIDTH Then
m.Result = New IntPtr(HTBOTTOMLEFT)
ElseIf pt.X > Me.ClientSize.Width - BORDER_WIDTH AndAlso pt.Y < BORDER_WIDTH Then
m.Result = New IntPtr(HTTOPRIGHT)
ElseIf pt.X > Me.ClientSize.Width - BORDER_WIDTH AndAlso pt.Y > Me.ClientSize.Height - BORDER_WIDTH Then
m.Result = New IntPtr(HTBOTTOMRIGHT)
ElseIf pt.X < BORDER_WIDTH Then
m.Result = New IntPtr(HTLEFT)
ElseIf pt.X > Me.ClientSize.Width - BORDER_WIDTH Then
m.Result = New IntPtr(HTRIGHT)
ElseIf pt.Y < BORDER_WIDTH Then
m.Result = New IntPtr(HTTOP)
ElseIf pt.Y > Me.ClientSize.Height - BORDER_WIDTH Then
m.Result = New IntPtr(HTBOTTOM)
End If
End If
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If e.Button = Windows.Forms.MouseButtons.None Then
Dim pt As New Point(e.X, e.Y)
pt = Me.PointToScreen(pt)
If pt.X < Me.Left + BORDER_WIDTH AndAlso pt.Y < Me.Top + BORDER_WIDTH Then
Me.Cursor = Cursors.SizeNWSE
ElseIf pt.X < Me.Left + BORDER_WIDTH AndAlso pt.Y > Me.Bottom - BORDER_WIDTH Then
Me.Cursor = Cursors.SizeNESW
ElseIf pt.X > Me.Right - BORDER_WIDTH AndAlso pt.Y < Me.Top + BORDER_WIDTH Then
Me.Cursor = Cursors.SizeNESW
ElseIf pt.X > Me.Right - BORDER_WIDTH AndAlso pt.Y > Me.Bottom - BORDER_WIDTH Then
Me.Cursor = Cursors.SizeNWSE
ElseIf pt.X < Me.Left + BORDER_WIDTH Then
Me.Cursor = Cursors.SizeWE
ElseIf pt.X > Me.Right - BORDER_WIDTH Then
Me.Cursor = Cursors.SizeWE
ElseIf pt.Y < Me.Top + BORDER_WIDTH Then
Me.Cursor = Cursors.SizeNS
ElseIf pt.Y > Me.Bottom - BORDER_WIDTH Then
Me.Cursor = Cursors.SizeNS
Else
Me.Cursor = Cursors.Default
End If
End If
End Sub
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left AndAlso Me.Cursor <> Cursors.Default Then
ResizeForm()
End If
End Sub
Private Sub ResizeForm()
Dim cursorX As Integer = Cursor.Position.X
Dim cursorY As Integer = Cursor.Position.Y
Dim screenRect As Rectangle = Screen.PrimaryScreen.WorkingArea
Dim maxWidth As Integer = screenRect.Width - Me.Left - 5
Dim maxHeight As Integer = screenRect.Height - Me.Top - 5
Select Case Me.Cursor
Case Cursors.SizeNWSE
While Cursor.Position.X = cursorX AndAlso Cursor.Position.Y = cursorY
Me.SetBounds(Me.Left, Me.Top, Math.Max(Me.Width - 1, MIN_WIDTH), Math.Max(Me.Height - 1, MIN_HEIGHT))
Application.DoEvents()
End While
Exit Select
Case Cursors.SizeNESW
While Cursor.Position.X = cursorX AndAlso Cursor.Position.Y = cursorY
Me.SetBounds(Me.Left + 1, Me.Top, Math.Max(Me.Width - 1, MIN_WIDTH), Math.Max(Me.Height - 1, MIN_HEIGHT))
Application.DoEvents()
End While
Exit Select
Case Cursors.SizeWE
While Cursor.Position.X = cursorX
Me.SetBounds(Me.Left, Me.Top, Math.Max(Math.Min(Cursor.Position.X - Me.Left, maxWidth), MIN_WIDTH), Math.Max(Me.Height, MIN_HEIGHT))
Application.DoEvents()
End While
Exit Select
Case Cursors.SizeNS
While Cursor.Position.Y = cursorY
Me.SetBounds(Me.Left, Me.Top, Math.Max(Me.Width, MIN_WIDTH), Math.Max(Math.Min(Cursor.Position.Y - Me.Top, maxHeight), MIN_HEIGHT))
Application.DoEvents()
End While
Exit Select
Case Cursors.SizeAll
Dim xDiff As Integer = 0
Dim yDiff As Integer = 0
While Cursor.Position.X = cursorX AndAlso Cursor.Position.Y = cursorY
xDiff = Cursor.Position.X - Me.Left
yDiff = Cursor.Position.Y - Me.Top
Me.SetBounds(Math.Max(Math.Min(Cursor.Position.X - xDiff, maxWidth), 0), Math.Max(Math.Min(Cursor.Position.Y - yDiff, maxHeight), 0), Math.Max(Me.Width, MIN_WIDTH), Math.Max(Me.Height, MIN_HEIGHT))
Application.DoEvents()
End While
Exit Select
End Select
End Sub
End Class
```
需要注意的是,此示例代码中使用了一些API函数来实现窗体的缩放操作。如果不熟悉API函数的使用,可以先学习一下相关知识。