lelouch_vi 2 Ответов: 2

Почему моя форма мерцает при изменении размера?


У меня возникли проблемы на некоторое время, и я решил принести это сюда, потому что я не могу найти хорошее решение для этого уродливого мерцания в моих WinForms.

Я сделал форму без полей и использую этот код, чтобы сделать форму перетаскиваемой и изменяемой по размеру на всех краях и углах.
Public Class Form2
    Private Const WM_NCHITTEST As Integer = &H84
    Private Const WM_MOUSEMOVE As Integer = &H200
    Private Const WM_LBUTTONDOWN As Integer = &H201
    Private Const WM_LBUTTONUP As Integer = &H202
    Private Const MK_LBUTTON As Integer = &H1
    Private Const HTLEFT As Integer = &HA
    Private Const HTRIGHT As Integer = &HB
    Private Const HTTOP As Integer = &HC
    Private Const HTTOPLEFT As Integer = &HD
    Private Const HTTOPRIGHT As Integer = &HE
    Private Const HTBOTTOM As Integer = &HF
    Private Const HTBOTTOMLEFT As Integer = &H10
    Private Const HTBOTTOMRIGHT As Integer = &H11
    Private OffSet As Point = Point.Empty

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.FormBorderStyle = FormBorderStyle.None
    End Sub



    Protected Overrides Sub WndProc(ByRef m As Message)
        If m.Msg = WM_NCHITTEST Then
            Dim loc As New Point(m.LParam.ToInt32 And &HFFFF, m.LParam.ToInt32 >> 16)
            loc = PointToClient(loc)
            Dim bTop As Boolean = (loc.Y < ClientRectangle.Y + 4)
            Dim bLeft As Boolean = (loc.X < ClientRectangle.X + 4)
            Dim bRight As Boolean = (loc.X > Width - 4)
            Dim bBottom As Boolean = (loc.Y > Height - 4)
            If bTop And bLeft Then
                m.Result = CType(HTTOPLEFT, IntPtr)
                Return
            ElseIf bTop And bRight Then
                m.Result = CType(HTTOPRIGHT, IntPtr)
                Return
            ElseIf bBottom And bLeft Then
                m.Result = CType(HTBOTTOMLEFT, IntPtr)
                Return
            ElseIf bBottom And bRight Then
                m.Result = CType(HTBOTTOMRIGHT, IntPtr)
                Return
            ElseIf bLeft Then
                m.Result = CType(HTLEFT, IntPtr)
                Return
            ElseIf bTop Then
                m.Result = CType(HTTOP, IntPtr)
                Return
            ElseIf bRight Then
                m.Result = CType(HTRIGHT, IntPtr)
                Return
            ElseIf bBottom Then
                m.Result = CType(HTBOTTOM, IntPtr)
                Return
            End If
        ElseIf m.Msg = WM_LBUTTONDOWN Then
            OffSet = New Point(MousePosition.X - Me.Location.X, MousePosition.Y - Me.Location.Y)
        ElseIf m.Msg = WM_MOUSEMOVE AndAlso m.WParam.ToInt32 = MK_LBUTTON Then
            Me.Location = New Point(MousePosition.X - OffSet.X, MousePosition.Y - OffSet.Y)
        End If
        MyBase.WndProc(m)
    End Sub

End Class


Затем, играя с формой, я обнаружил, что правая сторона мерцает, когда вы изменяете ее размер слева так же, как сверху и снизу. Если я изменяю размер формы сверху, то нижняя часть мерцает. Перетаскивание идеально, никаких проблем вообще нет, просто это изменение размера.

Что я уже пробовал:

Так вот, я думал, что это все из-за кода, который я использую. Поэтому я добавил в свой проект еще одну форму без каких-либо элементов управления, просто форму по умолчанию с границами и запустил ее, к моему удивлению, теперь там присутствует уродливое мерцание. Теперь я действительно зол, я не знаю, что, черт возьми, только что произошло. Если я не смогу найти решение для этого, я удалю visual studio и переустановлю его.

2 Ответов

Рейтинг:
2

lelouch_vi 2

Привет, Фил.,

Я попробовал, но безуспешно. Проблема в том, что мерцание теперь присутствует и в других моих проектах.

Рейтинг:
11

RickZeeland

Может быть, вы можете попробовать этот альтернативный способ: vb.net - как переместить форму без границы формы (visual studio) - переполнение стека[^]