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?

Foi útil?

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.

scroll top