为何移动窗体时会触发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事件。
区分移动与大小调整操作
如果需要在事件中区分两种场景,可以通过记录操作前的窗体状态来对比:
- 在窗体类中定义字段保存初始状态:
Private originalSize As Size Private originalLocation As Point
- 在
ResizeBegin事件中记录操作前的大小和位置:
Private Sub Form1_ResizeBegin(sender As Object, e As EventArgs) Handles MyBase.ResizeBegin originalSize = Me.Size originalLocation = Me.Location End Sub
- 在
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
相关产品推荐
相关产品推荐

