Schermo win dimensione del testo, percentuale di ingrandimento font

di il
1 risposte

Schermo win dimensione del testo, percentuale di ingrandimento font

Salve, non smetto mai di studiare e vorrei capire come un'applicazione WinForm possa reagire correttamente alle impostazioni di Windows settate dall'utente.
Mi riferisco al fatto che sulle proprietà dello schermo Win, un utente può scegliere la dimensione del testo, settandone la percentuale di ingrandimento: 100%, 125%, 150% (e anche personalizzate)

Se si scrive un'applicazione WinForm e nelle prorietà del form si imposta AtoScaleMode = Font, Win riscala tutto automaticamente e l'applicazione si adegua alle scelte dell'utente.

Il problema lo incontro quano si usa la GDI+ perché le coordinate e le dimensioni restituite dai vari controlli sono sempre riferite alla dimensione del testo = 100%, creando una discrepanza tra le dimensioni restituite e le dimensioni riscalate.

Per esempio se se in win ho la dimensione del testo impostata al 100%:
Apro un progetto e imposto da progettazione un form con
AtoScaleMode = Font
Size = 268;268

in runtime: this.Width = 268 (ma guarda un po'...)

Ora salvo il progetto, cambio le proprità dello schermo Win e imposto la dimensione del testo al 150%, disconnetto e riconnetto, riapro il progetto.

in progettazione nella proprietà Size del Form trovo 400;400 (AtoScaleMode ha fatto il suo dovere)

ma in runtime: this.Width restituisce 268 (problema)

Questo non mi va bene , perché se con le GDI+ voglio tracciare una riga larga come il form, e prima di tracciarla controllo la larghezza con this.Width; con la dimensione testo al 100% sarà giusta, con la dimensione testo al 150% sarà troppo corta!!!

Ho visto sulle MSDN molteplici esempi e spiegazioni riferite ai DPI del monitor, molto esurienti e funzionali, ma non ho trovato come si possa risalire da codice alle dimensioni impostate dall'utente per il testo, sapendole si possono gestire le situazioni.

Forse c'è un approcio diverso... automatizzato, chiedo il vostro consiglio.

1 Risposte

  • Re: Schermo win dimensione del testo, percentuale di ingrandimento font

    Ho visto che in Win10, il problema è stato risolto, per coloro che vogliono che la loro app WinForm funzioni corretamente sia in Win10, che in Win7 ho scritto questo codice che scopre la percentuale di ingrandimento settata in Win7.
    La percentuale di ingrandimento settata dall'utente è utile saperla solo se l'applicazione esegue comandi GDI+ in layer grafici, soggetti a ridimensionamenti e/o disegni di testi che devono essere centrati mediante calcoli che usano le coordinate grafiche riferite alla dimensione dei controlli.
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    // ingrandimento testi settato dall'utente in SCHERMO/DIMENSIONE TESTO, solo Win7
    
    namespace DimensioneTestoWin
    {
        public partial class Form1 : Form
        {
            
            [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = CharSet.Unicode)]
            public static extern int GetDialogBaseUnits();
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                SizeF a = AutoScaleDimensions;
                // 100% W=6 H=13  125% W=8 H=16   150% W=6 H=13
             
                int dlgBaseY = GetDialogBaseUnits() / 0x10000;
                // 100% 16  125% 20  150% 20
         
                if ( a.Height == 13 && dlgBaseY == 20)
                {
                    this.Text = "Dim testo = 150%";
                }
    
                if (a.Height == 16 && dlgBaseY == 20)
                {
                    this.Text = "Dim testo = 125%";
                }
    
                if (a.Height == 13 && dlgBaseY == 16)
                {
                    this.Text = "Dim testo = 100%";
                }
            }
        }
    }
    Per le applicazioni WPF, il problema resta anche con Win10, per scoprire il valore di ingrandimento settato dall'utente disegno una stringa e la misuro:
    using System.Diagnostics;
    using System.Windows;
    using System.Drawing;
    
    // dimensione testo settata dall'utente Win in SCHERMO/DIMENSIONE TESTO
    // per applicazione WPF
    
    namespace DimensioneTestoWinWPF
    {
        /// <summary>
        /// Logica di interazione per MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                Debug.Print(ControlloSize().ToString()); // risultato sull'output
            }
    
            public byte ControlloSize()
            {
                Bitmap bmp = new Bitmap(300, 100);
                Graphics gR = Graphics.FromImage(bmp);
                byte a = 200; // testo 200%
                // rettangolo immaginario di controllo
                SizeF RettangoloDiControllo = new SizeF(300.0F, 100.0F);
                // imposto il formato della stringa, direzione, destrasinistra ecc
                StringFormat FormatoStringa = new StringFormat();
                FormatoStringa.FormatFlags = StringFormatFlags.NoWrap;
                // ritorno misura.
                SizeF DimensioneStringa = new SizeF();
                int QuantiCaratteri;
                int QuanteRighe;
    
                using (Font Carattere = new Font("Arial", 26, System.Drawing.FontStyle.Bold))
                {
                    DimensioneStringa = gR.MeasureString("2048", Carattere, RettangoloDiControllo, FormatoStringa, out QuantiCaratteri, out QuanteRighe);
                }
    
                if (DimensioneStringa.Width < 95)
                {
                    a = 100; // testo 100%
                }
                else if (DimensioneStringa.Width < 120)
                {
                    a = 125; // testo 125%
                }
                else if (DimensioneStringa.Width < 150)
                {
                    a = 150; // testo 150%
                }
               return a;
            }
        }
    }
    I programmi sono testati su 2 PC Win7 e 3 PC Win10.

    Chiunque possa riferire un metodo più diretto per conoscere l'impostazione utente della dimensione del testo in win, prego segnalarla.
Devi accedere o registrarti per scrivere nel forum
1 risposte