Condividi:        

[Visual Basic] Dimensionare correttamente i form

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

[Visual Basic] Dimensionare correttamente i form

Postdi maxmula » 11/10/12 15:16

Ciao a tutti,
mi trovo a sviluppare programmi che vengono fatti girare su molti computer diversi, sia come impostazioni che come Sistema Operativo.
Nel mio progetto Visual Studio (uso sia VB6 che VB2010), tutto funziona e viene visualizzato correttamente; capita però che se un collega carica il software su un altro PC si produce il simpatico effetto visibile in figura:

Immagine

Uploaded with ImageShack.us


Il problema è dovuto sia al fatto che il computer del mio collega ha impostazioni diverse dal mio (io uso XP con stile di visualizzazione "classico", mentre sull'altro PC trovo XP o Seven, impostato in modo da visualizzare le finestre coi bordi "arrotondati"), sia alla dimensione dei caratteri utilizzati (su WIndows Seven, in alcuni casi, è sufficiente impostare la dimensione dei default 100% anziché al 125%), e sarebbe risolto se sapessi come impostare la dimensione dei form in modo adeguato, tenendo cioè conto delle dimensioni effettive sia dei miei controlli che del bordo della finestra;

Ed ecco la domanda: Al momento (a mia conoscenza) posso solo impostare le proprietà Width ed Height del form. Come posso tener conto anche del bordo in VB2010? Ed in VB6?

Grazie in anticipo!
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Sponsor
 

Re: [Visual Basic] Dimensionare correttamente i form

Postdi hydra » 15/10/12 09:13

Ho già avuto in passato problemi derivanti dalle dimensioni dei caratteri a 120 dpi: il testo veniva sempre sballato. In VBNET tieni conto che normalmente il ridimensionamento del form è impostato su font, ossia il form dovrebbe venir ridimensionato in base al carattere utilizzato (ovviamente se lo cambi), ma questo non mi pare valga se imposti il carattere a 120 dpi (in realtà il font dovrebbe essere lo stesso, è il SO che lo visualizza diversamente).
Per quanto riguarda la dimensione del form, potresti provare a modificare la proprietà FormBorderStyle; di default è impostata su Sizable, forse impostandola a FixedSingle qualcosa cambia, oppure puoi pensare di creare un form senza bordi, in quel caso la dimensione del form è esattamente la dimensione dell'area "grafica". Di più per il momento non mi viene in mente.
Avatar utente
hydra
Moderatore
 
Post: 7007
Iscritto il: 19/07/04 08:06
Località: Vallis Duplavis

Re: [Visual Basic] Dimensionare correttamente i form

Postdi maxmula » 15/10/12 13:40

In VB6, di solito, mi guardo bene dall'impostare i form come Sizable (a meno che ciò non sia strettamente necessario), in quanto poi mi troverei a dover gestire il riposizionamento di ogni singolo controllo nell'evento Form_Resize, il che non è sempre il massimo della vita, specialmente quando i controlli da gestire sono tanti.

Purtroppo, impostare la proprietà FormBorderStyle a FixedSingle non risolve: semplicemente il font più grande "deborda", causando ulteriori problemi (già sperimentato).

Forse potrebbe tornare utile "giocare" con le proprietà ScaleHeight e ScaleWidth del form, in modo che se il font è al 120% lo ripristino alle proporzioni originali rappresentandolo un po' più piccolo (se ho capito bene come funzionano questi oggetti). In ogni caso dovrei comunque riuscire a ricavare il valore impostato nel sistema, per poter poi fare i miei calcoli...


In .Net, invece, devo verificare quanto mi suggerisci: purtroppo è un po' che non lo uso più (anche se a breve dovrò tornarci); Ti farò sapere se scopro qualcosa di utile.

Ciao e grazie,
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Re: [Visual Basic] Dimensionare correttamente i form

Postdi maxmula » 10/03/14 16:04

Riesumo questo antico post.
Studiando & studiando, forse alla fine ho trovato una soluzione, valida sia per VB6 che per .Net: posto a beneficio di chi avesse il medesimo problema. :)

la soluzione che ho trovato (non è nuova, in realtà, bastave cercare bene in rete...) prevede di usare GetSystemMetrics, un'API di Windows che restituisce i valori, impostati a livello di Sistema, delle dimensioni dei form.

In pratica: in un modulo ho messo questo codice (dichiarazioni + routine MeasureWindowBorder):

Codice: Seleziona tutto
Public Module SUPPORT_FUNCTIONS
    ' Costanti da utilizzare, come da http://www.conitec.net/beta/asys_metrics.htm ; valori esplicitati come da header di Visual C++
    Const SM_CYCAPTION = 4      'Height of windows caption
    Const SM_CXBORDER = 5       'Width of no-sizable borders
    Const SM_CYBORDER = 6       'Height of non-sizable borders
    Const SM_CXDLGFRAME = 7     'Width of dialog box borders
    Const SM_CYDLGFRAME = 8     'Height of dialog box borders
    Const SM_CXEDGE = 45        'Width of the edge of a window with 3D-style
    Const SM_CYEDGE = 46        'Width of the edge of a window with 3D-style


    Public BordW As Long      ' Larghezza bordo di una finestra 2D
    Public BordH As Long       ' Altezza bordo di una finestra 2D (solitamente uguale alla larghezza)
    Public EdgeW As Long      ' Come BordW, ma per finestra con effetto 3D
    Public EdgeH As Long       ' Come BordH, ma per finestra con effetto 3D
    Public CaptH As Long       ' Altezza della "Caption", ovvero della cornice superiore del Form (la striscia che contiene il titolo della finestra)

    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

    Public Sub MeasureWindowBorder()
        '   reads border width & Height from system settings.
        '   Values are stored in BordW and BordH global variables.

        'BordW = (GetSystemMetrics(SM_CXDLGFRAME) * Screen.TwipsPerPixelX) * 2
        'BordH = (GetSystemMetrics(SM_CYDLGFRAME) * Screen.TwipsPerPixelY) * 2
        'EdgeW = (GetSystemMetrics(SM_CXEDGE) * Screen.TwipsPerPixelX) * 2
        'EdgeH = (GetSystemMetrics(SM_CYEDGE) * Screen.TwipsPerPixelY) * 2


        BordW = GetSystemMetrics(SM_CXDLGFRAME)
        BordH = GetSystemMetrics(SM_CYDLGFRAME)
        EdgeW = GetSystemMetrics(SM_CXEDGE)
        EdgeH = GetSystemMetrics(SM_CYEDGE)
        CaptH = GetSystemMetrics(SM_CYCAPTION)

    End Sub

End Module



All'avvio dell'applicazione, la primissima istruzione che viene eseguita (evento Load del form principale) è:

Codice: Seleziona tutto
Call MeasureWindowBorder()



A questo punto le variabili Public BordW, CaptH, ecc., contengono lo spazio (in pixel) occupato da ogni elemento della finestra; non rimene che utilizzare le informazioni per ridimensionare correttamente i form, all'interno dei rispettivi eventi Resize

Codice: Seleziona tutto
Private Sub MyForm_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
    ' In questo caso, desidero che l'altezza della finestra permetta di visualizzare completamente la Label MyLabel, più un piccolo margine

    Dim BottomMargin
    BottomMargin = 3

    Me.Height = CaptH + Me.MyLabel.Top + MyLabel.Height + BottomMargin  + 2 * BordH

End Sub




Spero che questo possa essere utile a qualcuno! :)
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34



Torna a Programmazione


Topic correlati a "[Visual Basic] Dimensionare correttamente i form":

Editor Visual Studio
Autore: Francesco53
Forum: Programmazione
Risposte: 6

Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti