Sfarfallio Resize Form senza bordi

di il
10 risposte

Sfarfallio Resize Form senza bordi

Buongiorno a tutti

ho una forma senza bordi, ho inserito un panel che mi servirà per ridimensionamento della form dall'alto verso il basso, il problema è che la base della form sfarfalla/sfilckering. E' possibile in qualche modo eliminarlo o semplicemente dove sbaglio ?

Grazie mille

Public Class Form1


   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       DoubleBuffered = True
       FormBorderStyle = FormBorderStyle.None

       PanResizeTopFBase.Size = New Size(Width, 2)
       PanResizeTopFBase.Location = New Point(0, 0)
       PanResizeTopFBase.BackColor = Color.Red
       PanResizeTopFBase.BorderStyle = BorderStyle.None
       PanResizeTopFBase.Anchor = AnchorStyles.Top + AnchorStyles.Left + AnchorStyles.Right
   End Sub

   Dim memT As Integer
   Dim memH As Integer

   Private Sub PanResizeTopFBase_MouseDown(sender As Object, e As MouseEventArgs) Handles PanResizeTopFBase.MouseDown
       memT = Top
       memH = Height
   End Sub

   Private Sub PanResizeTopFBase_MouseMove(sender As Object, e As MouseEventArgs) Handles PanResizeTopFBase.MouseMove
       Cursor.Current = Cursors.SizeNS
       If e.Button = Windows.Forms.MouseButtons.Left Then
           Dim p As Point = Control.MousePosition
           Dim Y As Integer = p.Y - PanResizeTopFBase.Height / 2

           SuspendLayout()

           Dim NuovoTop As Integer = Y - PanResizeTopFBase.Height / 2
           Dim Delta = memT - Top
           Height = memH + Delta
           Top = NuovoTop

           ResumeLayout()
           Refresh()
       End If
   End Sub

End Class

10 Risposte

  • Re: Sfarfallio Resize Form senza bordi

    28/02/2024 - piter123 ha scritto:


    ho una forma senza bordi, ho inserito un panel che mi servirà per ridimensionamento della form dall'alto verso il basso, il problema è che la base della form sfarfalla/sfilckering. E' possibile in qualche modo eliminarlo o semplicemente dove sbaglio ?

    Hai provato a rimuovere le chiamate a metodi quali SuspendLayout(), ResumeLayout() e/o Refresh() che dovrebbero essere gestite autonomamente in funzione del resize del pannello?

  • Re: Sfarfallio Resize Form senza bordi

    Si ho fatto tutte quest prove ma non cambia nulla

  • Re: Sfarfallio Resize Form senza bordi

    Forse potresti ottenere almeno un miglioramento spostando il SuspendLayout nell'evento MouseDown e il ResumeLayout nell'evento MouseUp, ma non ci scommetterei. Anche il Refresh non mi sembra necessario.

  • Re: Sfarfallio Resize Form senza bordi

    Con “SuspendLayout nell'evento MouseDown e il ResumeLayout nell'evento MouseUp” riduco lo sfarfallio ma non mi ridisegna li oggetti all'interno della form e le modigiche effettuate in MouseMove

    Migliora un pò udando DoubleBuffered

    Private Sub FBase_Resize(sender As Object, e As EventArgs) Handles Me.Resize
       Me.DoubleBuffered = True
       Me.Update()

    End Sub

  • Re: Sfarfallio Resize Form senza bordi

    Lo sfarfallio è  certamente dipendente anche dall'hardware coinvolto. Proviamo ad affrontare il problema in un altro modo.

    Se ho capito bene, tu vorresti ridimensionare in altezza il form trascinando verso il basso la linea rossa rappresentata dal panel, giusto? Questo meccanismo è un mezzo per ottenere uno scopo, cioè il tuo programma non è finalizzato a giocherellare con una linea rossa da tirare su e giù, quindi la domanda è: a cosa serve questo movimento? Conoscendo il vero scopo potrebbero venire in mente altre strade. Analizziamo il problema prima di implementare soluzioni.

  • Re: Sfarfallio Resize Form senza bordi

    29/02/2024 - grumpy ha scritto:


    Lo sfarfallio è  certamente dipendente anche dall'hardware coinvolto. Proviamo ad affrontare il problema in un altro modo.

    Se ho capito bene, tu vorresti ridimensionare in altezza il form trascinando verso il basso la linea rossa rappresentata dal panel, giusto? Questo meccanismo è un mezzo per ottenere uno scopo, cioè il tuo programma non è finalizzato a giocherellare con una linea rossa da tirare su e giù, quindi la domanda è: a cosa serve questo movimento? Conoscendo il vero scopo potrebbero venire in mente altre strade. Analizziamo il problema prima di implementare soluzioni.

    Ho un form senza bordi, dove poi creerò una serie di oggetti al suo interno e svilupperò il codice.

    Quasta form deve poter essere ridimensionata come se fosse una form borderstyle=sizable quindi trascinando dai lati con il mouse per ridimensionarla.

  • Re: Sfarfallio Resize Form senza bordi

    E questo lo avevi già detto. Ma la domanda è: perché hai un form non ridimensionabile se poi lo vuoi ridimensionare? Una risposta possibile potrebbe essere “perché non mi piace la barra del titolo”, nel qual caso potrebbero esserci altre strade.

  • Re: Sfarfallio Resize Form senza bordi

    Non puoi eliminarlo del tutto.

    28/02/2024 - piter123 ha scritto:


     Dim NuovoTop As Integer = Y - PanResizeTopFBase.Height / 2
               Dim Delta = memT - Top
               Height = memH + Delta
               Top = NuovoTop

               ResumeLayout()
               Refresh()

    Y-panresizeblabla.height / 2 bla bla….

    Diviso due??? Se height=pari ok ma se dispari?

    Prova a dargli manualmente il valore 200,5 e vedi che succede.

    Height accetta interi significa che al rilascio del mouse si aggiusta all'unità per difetto. Quindi trascinando va a scatti punto per punto (finche transiti da 100 a 101 il pannello sarà fermo a 100 per poi diventare 101, in quel momento si ridisegna generando lo sfarfallamento).

    Non credo che il programma nasca per giocare con le dimensioni del form, fatto una volta non fai più il resize, che ti frega se sfarfalla?

    Considera che se metti oggetti che si allargano e restringono di conseguenza l'effetto sarà più evidente.

    Scusa, una domanda: Refresh() a che serve? Hai dato al pannello altre dimensioni perché ridisegnarlo? Perché non sfarfalla abbastanza?

  • Re: Sfarfallio Resize Form senza bordi

    Intanto grazie a tutti, 

    1. la form senza bordi mi serve perchè non voglio la titlebar ma ne inseritò una tramite panel nella quale potrò inserire vari oggetti, non voglio fare nessuna polemica ma non vedo come quasto cambi sul risultato della mia richiesta.
    2. Si con il codice precedentemente scritto “Y-panresizeblabla.height / 2” ovviamente il bordo deve avere unicamente valore pari e mi rendo conto che non è la soluzione ideale.
    3. il refresh rimaneva all'interno di prove fatte ma ovviamente tende a effettuare sfarfallio.
    4. la form in questione diventerà poi un Mdi con all'interno altre form figlie e a seconda di diverse esigenze potrebbe aver bisogno di essere ridimensionata.

    questo è il mio codice credo ormai definitivo che utilizzerò :

    premessa : con i comandi in Private Sub Form1_Resize di seguito mi sembra sfarfalli meno, ma lascio a Voi il vostro utilissimo suggerimento.

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Me.FormBorderStyle = FormBorderStyle.None

       PanTop.Size = New Size(Me.Size.Width, 5)
       PanBottom.Size = New Size(Me.Size.Width, 5)
       PanLeft.Size = New Size(5, Me.Size.Height)
       PanRight.Size = New Size(5, Me.Size.Height)

       PanTop.Location = New Point(0, 0)
       PanBottom.Location = New Point(0, Me.Size.Height - 5)
       PanRight.Location = New Point(Me.Size.Width - 5, 0)
       PanLeft.Location = New Point(0, 0)

       PanTop.BackColor = Color.Red
       PanBottom.BackColor = Color.Red
       PanLeft.BackColor = Color.Red
       PanRight.BackColor = Color.Red

       PanTop.Anchor = AnchorStyles.Top + AnchorStyles.Left + AnchorStyles.Right
       PanBottom.Anchor = AnchorStyles.Bottom + AnchorStyles.Left + AnchorStyles.Right
       PanLeft.Anchor = AnchorStyles.Top + AnchorStyles.Bottom + AnchorStyles.Left
       PanRight.Anchor = AnchorStyles.Top + AnchorStyles.Bottom + AnchorStyles.Right

    End Sub

    Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
       Me.DoubleBuffered = True
       Me.Update()
    End Sub

    Private Sub PanTop_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PanTop.MouseMove
       Cursor.Current = Cursors.SizeNS
       If e.Button = Windows.Forms.MouseButtons.Left Then
           If Me.Size.Height + (Me.Location.Y - MousePosition.Y) > 300 Then
               Me.Size = New Size(Me.Size.Width, Me.Size.Height + (Me.Location.Y - MousePosition.Y))
               Me.Location = New Point(Me.Location.X, MousePosition.Y)
           End If
       End If
    End Sub

    Private Sub PanBottom_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PanBottom.MouseMove
       Cursor.Current = Cursors.SizeNS
       If e.Button = Windows.Forms.MouseButtons.Left Then
           If MousePosition.Y - Me.Location.Y > 300 Then
               Me.Size = New Size(Me.Size.Width, MousePosition.Y - Me.Location.Y)
           End If
       End If
    End Sub

    Private Sub PanLeft_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PanLeft.MouseMove
       Cursor.Current = Cursors.SizeWE
       If e.Button = Windows.Forms.MouseButtons.Left Then
           Me.Size = New Size(Me.Size.Width + (Me.Location.X - MousePosition.X), Me.Size.Height)
           Me.Location = New Point(MousePosition.X, Me.Location.Y)
       End If
    End Sub

    Private Sub PanRight_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PanRight.MouseMove
       Cursor.Current = Cursors.SizeWE
       If e.Button = Windows.Forms.MouseButtons.Left Then
           Me.Size = New Size(MousePosition.X - Me.Location.X, Me.Size.Height)
       End If
    End Sub

  • Re: Sfarfallio Resize Form senza bordi

    04/03/2024 - piter123 ha scritto:


    1. la form senza bordi mi serve perchè non voglio la titlebar ma ne inseritò una tramite panel nella quale potrò inserire vari oggetti, non voglio fare nessuna polemica ma non vedo come quasto cambi sul risultato della mia richiesta.

    Nessuna polemica. Una form ridimensionabile senza titolo (se questo è lo scopo) si ottiene facilmente impostando ControlBox = False e Text = stringa vuota.

    P.S.: Per favore, quando posti del codice, racchiudilo tra gli appositi tag <> .

Devi accedere o registrarti per scrivere nel forum
10 risposte