[VB.NET] ridimensionamento del form in modo proporzianale allo schermo

Con risposta [VB.NET] ridimensionamento del form in modo proporzianale allo schermo

  • lunedì 14 maggio 2012 10:17
     
     

    ciao a tutti ho un form di dimensione 1500; 1100 che viene visualizzato automaticamente a schermo intero senza la possibilità di ridimensionare il form.
    Il problema è che il conteno del form durante l'avvio non si ridimensiona in modo proporzionale alle dimensione dello schermo con dimensioni diverso dal mio (22 pollici).

    Per esempio se passo da uno schermo di 22 pollici a uno da 15 le picturebox non si rimpiccioliscono in modo proporzionabile ma rimangono nelle dimensione impostaste su schermo da 22 pollici stessa cosa per la posizione (anche se inserisco la proprietà anchor su tutti i lati del form)


    ho pesato di utilizzare una funzione che rilevi le dimensione del monitor e di conseguenza trasformare in modo proporzionale il contenuto del form (ovvero la posizione e dimensione delle picturebox e label presenti nel form)

    Può funzionare come idea o esiste un modo migliore?

Tutte le risposte

  • lunedì 14 maggio 2012 12:46
     
     
    Ciao, devi impostare la proprietà BackgroundImageLayout in Stretch
     per le immagini
    • Modificato mattiasrk lunedì 14 maggio 2012 12:46
    • Modificato mattiasrk lunedì 14 maggio 2012 13:01
    •  
  • lunedì 14 maggio 2012 12:56
     
     
    Devi usare le proprietà Anchor dei diversi oggetti che vuoi che si adattino al ridimensionamento del form: http://msdn.microsoft.com/it-it/library/system.windows.forms.control.anchor.aspx.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • lunedì 14 maggio 2012 13:01
     
     

    Ciao Marco, anche io ero propenso a dire Anchor, ma come ha scritto wjzard, lo usa già e non funziona.

    Comunque edito il post precedente in quanto ho letto male il problema. 

    la proprietà BackgroundImageLayout in Stretch viene usata per le immagini. Poi non so se ha la stessa funzione di anchor.

  • lunedì 14 maggio 2012 14:49
     
     

    La proprietà BackgroundImageLayout imposta la modalità di visualizzazione dell'immagine di sfondo del form (o, più in generale, di un controllo): http://msdn.microsoft.com/it-it/library/system.windows.forms.control.backgroundimagelayout.aspx.

    La soluzione al problema citato da wjzard è proprio la proprietà Anchor, di cui ho fornito il link in modo da trovare maggiori informazioni sul suo utilizzo. Probabilmente al momento è utilizzata in modo errato, perché il suo scopo è proprio quello di fare in modo che i controlli si adattino alla dimensione del form, specificando i bordi a cui devono esssere "ancorati".


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • lunedì 14 maggio 2012 15:56
     
     

    Per spiegarmi meglio mostro cosa succede se apro il programma con uno schermo piu piccolo e sul mio:

    Sul mio schermo:

    https://docs.google.com/open?id=0B6PhsWCaF6vLTFZYQjY0blVGNTQ

    su uno schermo piu piccolo:

    https://docs.google.com/open?id=0B6PhsWCaF6vLQnh2WDNJcHdteWs

    come potete vedere ogni numero corrisponde a una picturebox e sono tutte ancorate su tutti i lati del form.


    • Modificato wjzard lunedì 14 maggio 2012 16:23
    •  
  • lunedì 14 maggio 2012 16:01
     
     
    La prima immagine non si vede.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • lunedì 14 maggio 2012 16:21
     
     
    Prova a copiare il link a me si vede 
  • lunedì 14 maggio 2012 16:30
     
     

    E' quello che ho fatto, ma  continuo a non vedere niente (sola la classica X rossa di immagine non trovata).

    Prova ad includere l'immagine direttamente nel post.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • lunedì 14 maggio 2012 16:37
     
     

    E' quello che ho fatto, ma  continuo a non vedere niente (sola la classica X rossa di immagine non trovata).

    Prova ad includere l'immagine direttamente nel post.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva


    le dimensioni del form sono uguali alla risoluzione del mio schermo (1920;1080)

    • Modificato wjzard lunedì 14 maggio 2012 16:39
    •  
  • lunedì 14 maggio 2012 16:44
     
     

    OK, se quella che hai mostrato è la visualizzazione "base", gli oggetti della form dovrebbero essere ancorati a destra e sinistra, in modo che rimangano sempre al centro della form.

    C'è poi il problema che tutte le ruote che mostri, in verticale, potrebbero non entrare in uno schermo più piccolo, quindi dovresti prevedere una barra di scorrimento.

    Più in generale, per creare interfacce di questo tipo non standard, dovresti valutare la possibilità di passare a WPF, che ti fornisce una flessibilità sicuramente maggiore da questo punto di vista.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • lunedì 14 maggio 2012 16:54
     
     

    OK, se quella che hai mostrato è la visualizzazione "base", gli oggetti della form dovrebbero essere ancorati a destra e sinistra, in modo che rimangano sempre al centro della form.

    Il problema che le dimensioni delle varie picturebox e label non cambiano in modo proporzionale e quindi vanno una sopra l'altra

    C'è poi il problema che tutte le ruote che mostri, in verticale, potrebbero non entrare in uno schermo più piccolo, quindi dovresti prevedere una barra di scorrimento.

    Vorrei evitare una barra di scorrimento quindi l'unico modo è rimpicciolire tutto

    Più in generale, per creare interfacce di questo tipo non standard, dovresti valutare la possibilità di passare a WPF, che ti fornisce una flessibilità sicuramente maggiore da questo punto di vista.

    è un argomento che non ho mai studiato non potrei utilizzare una funzione che rilevi le dimensione del monitor e di conseguenza trasformare in modo proporzionale il contenuto del form (ovvero la posizione e dimensione delle picturebox e label presenti nel form)?


  • lunedì 14 maggio 2012 17:18
     
     Risposta suggerita

    Il problema che le dimensioni delle varie picturebox e label non cambiano in modo proporzionale e quindi vanno una sopra l'altra

    Impostando correttamente la proprietà Anchor delle varie PictureBox, puoi ottenere il comportamento desiderato, ma è un po' difficile spiegarti come devono essere impostate. Non tutte le PictureBox dovranno avere lo stesso valore per la proprietà Anchor (dipende dalla loro posizione rispetto alle altre), quindi l'unica cosa che puoi fare è avere pazienza e provare.

    è un argomento che non ho mai studiato

    Mi sembra il momento giusto per iniziare allora :-)

    non potrei utilizzare una funzione che rilevi le dimensione del monitor e di conseguenza trasformare in modo proporzionale il contenuto del form (ovvero la posizione e dimensione delle picturebox e label presenti nel form)?

    Certo che puoi, ma è un lavoraccio...


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    • Proposto come risposta mattiasrk lunedì 14 maggio 2012 18:24
    •  
  • lunedì 14 maggio 2012 18:10
     
     

    Ciao, se il form è solo una presentazione, nel senso che non prevede l'interazione con l'utente, potresti evitare di usare controlli e usare un'oggetto graphics per disegnarci sopra, con i vari metodi che quest'oggetto permette di utilizzare. (DrawEllipse, DrawString, DrawImage ecc. ecc.)

    Anche se, come suggerito prima da Marco, niente è meglio di WPF, per presentazioni e UI bellissime non solo per l'aspetto.

    Ciao.


    mario formosa


  • lunedì 14 maggio 2012 19:03
     
     

    Ciao, se il form è solo una presentazione, nel senso che non prevede l'interazione con l'utente, potresti evitare di usare controlli e usare un'oggetto graphics per disegnarci sopra, con i vari metodi che quest'oggetto permette di utilizzare. (DrawEllipse, DrawString, DrawImage ecc. ecc.)

    Anche se, come suggerito prima da Marco, niente è meglio di WPF, per presentazioni e UI bellissime non solo per l'aspetto.



    Diciamo che l'utente finale deve guardare e basta però si deve aggiornare ogni 5 minuti.

    Inoltre preferirei utilizzare le wpf come ultima spiaggia.

    Con la proprietà anchor non sono riuscito ad ottenere nulla ad esempio le scritte che ho in alto le ho provate ad ancorare quella di destra in alto e a destra mentre quella di sinistra in alto a sinistra  però il risultato che viene fuori è che mi mostra sola quella a destra al centro.

    Non è mica un perchè ho dato una dimensione fissa al form? dovrei magari dare una dimensione minima e una massima?

    • Modificato wjzard lunedì 14 maggio 2012 19:18
    •  
  • martedì 15 maggio 2012 10:43
     
     Con risposta Contiene codice

    Ciao, nella speranza di farti cosa gradita posto un esempio che principalmente mostra un impiego di Graphics. L'esempio usa due immagini che devono essere caricate nelle risorse del progetto,  Sfondo e p1 che sono lo sfondo e il cerchietto sul quale viene scritto il numero.

    L'adattamento alla risoluzione può essere effettuato agendo sui valori Scala,posX e Pos Y della sub 'MostraDati'.

    Ogni 5 secondi viene chiamata la sub AggiornaDati.

    Public Class Formx
    
        Dim gr As Graphics
        Dim WithEvents t1 As New Timer
        Dim ruote() As String = {"Bari", "Cagliari", "Firenze", "Milano", "Roma", "Genova", "Palermo", "Napoli", "Torino", "Venezia"}
        Dim estratti() As String = {"01,12,21,33,45", "01,22,44,38,76", "15,22,31,87,88", "09,62,66,80,90", "14,33,38,55,60", "14,33,38,55,60", "14,33,38,55,60", "14,33,38,55,60", "14,33,38,55,60", "14,33,38,55,60"}
    
        Private Sub Formx_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
            If e.KeyCode = Keys.Escape Then End
        End Sub
    
        Private Sub Formx_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
            Me.WindowState = FormWindowState.Maximized
            Me.BackgroundImage = My.Resources.sfondo
    
            '300mila millisecondi = 5 minuti
            t1.Interval = 5000
    
            t1.Enabled = True
    
        End Sub
    
        Private Sub Formx_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
            gr = e.Graphics
            MostraDati()
        End Sub
    
        Sub MostraDati()
    
            'agendo su questi tre valori si può ottenere la migliore visualizzazione
            Dim scala As Decimal = 1.8
            Dim PosX As Decimal = 30
            Dim PosY As Decimal = 50
    
            ' gr.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    
            ' gr.FillRectangle(Brushes.White, PosY, PosX, 265 * scala, 175 * scala)
    
            Dim sf As New System.Drawing.StringFormat
    
            sf.Alignment = StringAlignment.Center
            sf.LineAlignment = StringAlignment.Center
    
            Dim f1 As New Font("Arial", 12 * scala)
            Dim f2 As New Font("Arial", 10 * scala, FontStyle.Bold)
    
            For t = 0 To ruote.Length - 1
                gr.DrawString(ruote(t), f1, Brushes.White, New RectangleF(PosX, PosY + t * 35 * scala, 80 * scala, 35 * scala), sf)
                Dim ne() As String = estratti(t).Split(",")
                For k = 0 To ne.Length - 1
                    gr.DrawImage(My.Resources.p1, PosX + 90 * scala + k * 35 * scala, PosY + 35 * scala * t, 30 * scala, 30 * scala)
                    'gr.FillEllipse(Brushes.Yellow, PosX + 90 * scala + k * 35 * scala, PosY + 35 * scala * t, 30 * scala, 30 * scala)
                    gr.DrawString(ne(k), f2, Brushes.DarkBlue, New RectangleF(PosX + 90 * scala + k * 35 * scala, PosY + 35 * scala * t, 30 * scala, 30 * scala), sf)
                Next
            Next
    
        End Sub
    
        Sub AggiornaDati()
    
            'genera numeri pseudocasuali
            t1.Enabled = False
            Dim s As String
            For t = 0 To ruote.Length - 1
                s = ""
                For k = 0 To 4
                    s = s + Int(Rnd(1) * 90).ToString.PadLeft(2, "0") + ","
                Next
                s = s.Trim(",")
                estratti(t) = s
            Next
    
            Me.Refresh()
    
            t1.Enabled = True
        End Sub
    
        Private Sub t1_Tick(sender As Object, e As System.EventArgs) Handles t1.Tick
            AggiornaDati()
        End Sub
    End Class

    Uno screenshot


    mario formosa


    • Modificato Mario Formosa martedì 15 maggio 2012 10:54
    • Contrassegnato come risposta wjzard martedì 15 maggio 2012 17:22
    •  
  • martedì 15 maggio 2012 17:22
     
     
    Grazie per l'esempio adesso proverò ad adattarlo al mio programma e vediamo come viene