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.