Domanda

Ho una forma posizionato leggermente al di sopra della barra barra delle applicazioni / applicazioni nell'angolo in basso a destra della mia finestra del desktop. E 'un po' come una notifica pop-up. La notifica in sé sembra grande, ma c'è un pulsante su di esso che ridimensiona la forma up, animando il dimensionamento con incrementi di 5px pur mantenendo la sua posizione rispetto al nell'angolo in basso a destra dello schermo.

Il problema di questo è che non sembra molto liscia. Regolazione Me.Width ridimensiona da sinistra in modo da avere per poi spostare il modulo a sinistra con Me.Left per compensare. Me.SetBounds sembra solo essere un wrapper per impostare tali proprietà in ogni caso.

C'è qualcosa che posso fare per avere la forma senza problemi (o almeno sembra) ridimensionare verso l'esterno alla sinistra del modulo?

È stato utile?

Soluzione

ETA: Si può effettivamente farlo usando SetBounds, come SetBounds delegherà a SetBoundsCore, che, a sua volta richiamare SetWindowPos. Così SetBounds sarà internamente davvero impostare tutti i limiti in una volta e il window manager ridisegna la finestra unica dopo tutte le proprietà sono impostate.


Un'altra opzione sarebbe quella di importare la MoveWindow funzione e l'uso che, invece. Produce un'animazione fluida qui, come si può impostare la dimensione e la posizione contemporaneamente prima dice il window manager per ridisegnare la finestra.

Il mio codice di prova si presentava così (convertito da C # tramite IL a VB con l'aiuto di 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

Altri suggerimenti

Non ho mai provato a farlo, ma hai provato impostando la proprietà DoubleBuffer del form su true? Questo dovrebbe lisciare il disegno.

Si potrebbe provare a ridurre le fasi di pixel è incrementali fino al 1-2 e, 5px sembra molto a regolare le dimensioni, ho potuto vedere come questo potrebbe apparire instabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top