You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何移动窗体时会触发ResizeEnd事件?

移动窗体触发ResizeEnd事件的原因分析

这是Windows窗体底层的设计特性——.NET的ResizeEnd事件本质上是对Windows系统WM_EXITSIZEMOVE消息的封装,而这条消息在**窗口重定位操作结束时(包括移动、调整大小后松开鼠标)**都会被系统发送给窗体,它并不区分操作是改变了大小还是仅仅移动了位置。

验证底层消息

你可以通过重写WndProc方法直接观察系统发送的消息,确认这一点:

Protected Overrides Sub WndProc(ByRef m As Message)
    ' WM_EXITSIZEMOVE 的消息常量值为 &H232
    If m.Msg = &H232 Then
        Debug.WriteLine("接收到 WM_EXITSIZEMOVE 消息")
    End If
    MyBase.WndProc(m)
End Sub

运行后会发现,无论是拖动调整窗体大小,还是拖动移动窗体,松开鼠标时都会触发这条消息,进而引发ResizeEnd事件。

区分移动与大小调整操作

如果需要在事件中区分两种场景,可以通过记录操作前的窗体状态来对比:

  1. 在窗体类中定义字段保存初始状态:
Private originalSize As Size
Private originalLocation As Point
  1. 在ResizeBegin事件中记录操作前的大小和位置:
Private Sub Form1_ResizeBegin(sender As Object, e As EventArgs) Handles MyBase.ResizeBegin
    originalSize = Me.Size
    originalLocation = Me.Location
End Sub
  1. 在ResizeEnd事件中对比判断:
Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles MyBase.ResizeEnd
    If Me.Size <> originalSize Then
        MsgBox("窗体大小已调整")
    ElseIf Me.Location <> originalLocation Then
        MsgBox("仅移动了窗体位置")
    End If
End Sub

内容的提问来源于stack exchange,提问作者Eric van Loon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:35:29