Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [VB2010 WinForms] metodo .scale()

    per ridimenzionare un controllo ( e sui filgi) del 75 % , quali parametri devo passare a questo metodo?

    codice:
    me.scale(sizeF)
    sizeF non mi è chiaro...
    Michele

  2. #2
    Il metodo che hai indicato tu è obsoleto, MSDN consiglia questo che permette di specificare la scala in maniera distinta per la larghezza e l'altezza:
    codice:
    Me.Scale(New SizeF(1.1, 1.1))
    Il valore numerico da passare è il coefficiente che .net utilizza per calcolare la nuova larghezza/altezza del form e dei suoi controlli. Nell'esempio che ti ho riportato, la misura del form dopo la chiamata del metodo sarà Me.Width = Me.Width * 1.1. Ovviamente, passando un valore compreso tra 0 e 1 le misure diminuiranno.
    Chi non cerca trova.

  3. #3
    Originariamente inviato da tas
    Il metodo che hai indicato tu è obsoleto, MSDN consiglia questo che permette di specificare la scala in maniera distinta per la larghezza e l'altezza:
    codice:
    Me.Scale(New SizeF(1.1, 1.1))
    Il valore numerico da passare è il coefficiente che .net utilizza per calcolare la nuova larghezza/altezza del form e dei suoi controlli. Nell'esempio che ti ho riportato, la misura del form dopo la chiamata del metodo sarà Me.Width = Me.Width * 1.1. Ovviamente, passando un valore compreso tra 0 e 1 le misure diminuiranno.
    non capivo cosa fossero quei parametro , adesso mi è chiaro grazie ancora
    Michele

  4. #4
    un'altra cosa: esisiste una proprietà che restituisce il fattore (o percentuale) di scala attuale rispetto alle dimenzioni originali dei controlli/o?

    mi spiego:
    ho pensato di inserire due bottoni (in comune, per qualsiasi Tabs, non mi dilungo in questo.. ) con rispettivo nome: zoom_in e zoom_out che chiamano lo stesso Handle per l'evento click, differenziando la chiamata con il controllo di Sender.name se continete out =rimpicciolisce, altrimenti ingrandisce.. il fattore di scala l'ho fissato (per il momento..poi sarà settato dal menù) a 0.4 e viene calcolato = 1 + o - 0.4 asseconda se deve rimpicciolire o ingrandire..
    l'iterazione va cercare, nella tabs attiva, il pannello contenente le tablelayoutpanel e quindi mi ridimenziona tutte le tablelayoutpanel contenute nel pannello di quella pagina:
    ***l'ho reso unico e valido per tutte le tabs presenti che vengono crate dinamicamnte e per evitare di scrivere codice ripetitivo..(il codice ripetitivo non mi piace e diventa una seccatura per le future manutenzioni o upgrade)

    detto questo, ecco la procedura:
    codice:
        Private Sub Zoom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Zoom_out.Click, Zoom_in.Click
    
            Dim F As Single = 0.4, M As Single = 1 + IIf(sender.name.Contains("out"), -F, F)
    
            For Each Ctrl As Control In Tab.SelectedTab.Controls
                If Ctrl.GetType.Name = "Panel" Then
                    For Each Ctrl2 As Control In Ctrl.Controls
                        If Ctrl2.GetType.Name = "TableLayoutPanel" Then
    
                            Ctrl2.Scale(New SizeF(M, M))
    
                        End If
                    Next
                End If
            Next
        End Sub
    ora, dovrei inserire una label per far comparire la percentuale di zoom attuale, ed è proprio questo che non riesco fare.. come reperire tale rapporto di zoom? ..senza fare calcoli particolari o tenere traccia delle varie chiamate...!?
    Michele

  5. #5
    Il metodo Scale non applica una sorta di zoom ai controlli ma ne modifica effettivamente le dimensioni. Non ho trovato nessuna proprietà in grado di restituire il fattore di scala, ti conviene memorizzare le dimensioni iniziali del form e determinare lo zoom corrente facendo il rapporto tra le dimensioni attuali e quelle originali.
    Chi non cerca trova.

  6. #6
    era proprio quello che non volevo sentire

    il metodo suggeritomi è il migliore e precisiso, però nel mio caso mi risulta complicato implementarlo in quanto gli oggetti da scalare sono tanti e vengono creati e cancellati dinamicamente, avrei dovuto tener conto anche di questo (per ciò mi sono dilungato nella spiegazione)...
    di solito uso Il tag del controllo per memorizzare valori personali riferiti a tale controllo ( e in questo caso sarebbe stato utile al caso) ma putroppo l'ho già utilizzato per altre funzioni (ridimenzionamento e spostamento degli oggetti tramite mouse durante l'esecuzione )

    alla fine ho optato per un valore percentuale di zoom per ogni pagina distinta che viene memoriazzato del Tag del Pannello contenitore e ricalcolato a ogni "scale" effettuato agli oggetti contenuti ( a mo di percentuale). Così mi permette di ritrovarmi tale fattore anche per i controlli da creare nuovi..insomma mi permette di lavorare costantemente con quella percentuale di zoom impostata nella textbox Zoom_Percent.Text come valore corrente per la pagina attiva...ed è possibile anche settarlo a piacimento..

    se può interessare e risulta comprensibile , la procedura postata l'ho evoluta in questo modo :
    codice:
        Private Sub Zoom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs, Optional ByVal Percent As String = Nothing) Handles Zoom_out.Click, Zoom_in.Click
    
            Dim F As Single = 25 / 100, M As Single = 1 + IIf(sender.name.Contains("out"), -F, F)
            Dim Aggiorna As Boolean = False
            Do
                For Each Ctrl As Control In GetControls(Tab.SelectedTab, "Panel")
                    If Not IsNothing(Percent) Then M = 1 + (Val(Percent) - Val(Ctrl.Tag)) / 100
                    For Each Ctrl2 As Control In GetControls(Ctrl, "TableLayoutPanel")
                        Ctrl2.Scale(New SizeF(M, M)) : Aggiorna = True
                    Next
                    If Aggiorna Then
                        Ctrl.Tag = Val(Ctrl.Tag) * M
                        Zoom_Percent.Text = Format(Val(Ctrl.Tag), "0.00 \%")
                        Aggiorna = False
                    End If
                Next
                If IsNothing(Percent) Then Exit Do
            Loop Until Val(Percent) = Val(Zoom_Percent.Text)
        End Sub
    ho aggiunto un parametro optional che fornisce la percentuale (quando passato), e un cilclo che cicla fino a quando non raggiunge l'effettiva percentuale passatoli come argomento..
    lo so è un po ostico ma che ci potevo fare!
    quando dev'essere chiamata per settare una determinata percentuale (impostata nella TextBox con nome Zoom_percent, verrà chiamata così:
    codice:
            Call Zoom_Click(sender, e, Zoom_Percent.Text)
    Michele

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.