Вопрос

У меня есть форма, расположенная немного выше панели задач / системного трея в правом нижнем углу окна моего рабочего стола.Это что-то вроде всплывающего уведомления.Само уведомление выглядит великолепно, но на нем есть кнопка, которая увеличивает размер формы, анимируя изменение размера с шагом в 5 пикселей, сохраняя при этом его положение относительно нижнего правого угла экрана.

Проблема в том, что это выглядит не очень гладко.Настройка Я.Ширина изменяет размер слева, поэтому затем вам нужно переместить форму влево с помощью Я.Слева чтобы компенсировать это.Me.setBounds в любом случае кажется просто оболочкой для настройки этих свойств.

Могу ли я что-нибудь сделать, чтобы форма плавно (или, по крайней мере, казалось, что она изменяется) изменяла размер слева от формы?

Это было полезно?

Решение

ETA: На самом деле вы можете сделать это с помощью SetBounds, как SetBounds будет делегировать SetBoundsCore который, в свою очередь, вызовет SetWindowPos.Итак SetBounds будет ли внутренне действительно установить все границы сразу, и оконный менеджер будет перерисовывать только окно после все свойства установлены.


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

Мой тестовый код выглядел следующим образом (преобразован из C # через IL в VB с помощью Reflector):

Private button1 As Button
Private components As IContainer = Nothing
Private tm As Timer = New Timer

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
    MyBase.Left = (Screen.PrimaryScreen.WorkingArea.Width - MyBase.Width)
    MyBase.Top = (Screen.PrimaryScreen.WorkingArea.Height - MyBase.Height)
    Me.tm.Enabled = False
    Me.tm.Interval = 20
    AddHandler Me.tm.Tick, Function 
        If (MyBase.Width < 500) Then
            Form1.MoveWindow(MyBase.Handle, (MyBase.Left - 5), (MyBase.Top - 5), (MyBase.Width + 5), (MyBase.Height + 5), True)
        Else
            Me.tm.Enabled = False
        End If
    End Function
End Sub

<DllImport("user32.dll", SetLastError:=True)> _
Friend Shared Function MoveWindow(ByVal hWnd As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bRepaint As Boolean) As Boolean
End Function

Другие советы

Я никогда не пробовал этого, но вы пробовали устанавливать для свойства DoubleBuffer формы значение True?Это должно сгладить рисунок.

Вы также можете попробовать уменьшить шаги пикселя, которые он увеличивает, до 1-2, 5 пикселей кажутся слишком большими для настройки размера, я мог видеть, как это может выглядеть изменчиво.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top