Animando forma de redimensionamento em VB.NET
Pergunta
Eu tenho um formulário posicionado ligeiramente acima da bandeja da barra de tarefas / sistema, no canto inferior direito da janela do meu desktop. É como uma espécie de notificação pop-up. A notificação em si parece ótimo, mas há um botão sobre ele que redimensiona a forma-se, animando o dimensionamento em incrementos de 5px, embora mantendo a sua posição em relação ao canto inferior direito da tela.
O problema com isso é que ele não parece muito bom. Ajustar Me.Width redimensiona a partir da esquerda Então você tem que, em seguida, mover o formulário para a esquerda com Me.Left para compensar. Me.SetBounds apenas parece ser um wrapper para definir as propriedades de qualquer maneira.
Existe algo que eu possa fazer para ter a forma suavemente (ou pelo menos parece) redimensionar o exterior a partir da esquerda da forma?
Solução
ETA: Você pode realmente fazer isso usando SetBounds
, como SetBounds
vai delegar SetBoundsCore
que, por sua vez, irá chamar SetWindowPos
. Então SetBounds
irá internamente realmente definir todos os limites de uma vez e o gerenciador de janelas irá redesenhar somente a janela após todas as propriedades são definidas.
Outra opção seria a de importar o href="http://msdn.microsoft.com/en-us/library/ms633534(VS.85).aspx" rel="nofollow noreferrer"> função MoveWindow
e utilizá-lo. Ela produz uma animação suave aqui, pois ele pode definir o tamanho ea posição simultaneamente antes dizendo o gerenciador de janelas para redesenhar a janela.
O meu código de teste olhou como este (convertido a partir de C # via IL para VB com a ajuda do refletor):
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
Outras dicas
Eu nunca tentei isso, mas você já tentou definir a propriedade DoubleBuffer da forma como True? Isso deve suavizar o desenho.
Você pode tentar reduzir as etapas de pixels é incrementado para baixo para 1-2, bem como, 5px parece muito a ajustar o tamanho, eu podia ver como isso poderia aparecer instável.