Newsgroup: it.comp.lang.visual-basic
Titolo: VB6 e dimensione caratteri Windows fuori standard

Salve a tutti,
mi sto scontrando con il rognosissimo problema di disallineamento degli 
oggetti grafici (che sicuramente molti di voi conosceranno bene) che si 
verifica quando un utente lancia la mia applicazione su una macchina Windows 
settata con i caratteri di Windows in "dimensione personalizzata". :-(
Proprietà - Schermo - Impostazioni DPI
Windows permette 3 tipi di impostazioni:
- Normale (96 dpi)
- Grande (120dpi)
- Impostazioni personalizzate...
Con le prime due (96 e 120) non c'è alcun problema!
Usando invece la terza opzione, ad esempio configurando i caratteri di 
Windows a 86dpi (90% della dimensione normale) iniziano i dolori... :-(
Gli oggetti grafici sembrano non rispondere più alle proporzioni stabilite!
Premetto che nel mio programma utilizzo SEMPRE i "twips", come unità di 
misura per stabilire le dimensioni ed il posizionamento degli oggetti nella 
form.
Esempio:
Se imposto la width di un oggetto Picture ad un certo numero X, ed imposto 
la width di un oggetto ListView allo *stesso* numero X... beh... il 
risultato è che sullo schermo i due oggetti hanno una larghezza 
completamente differente!!
:-((
Ovviamente questo comporta un disallineamento mostruoso di tutta 
l'interfaccia grafica, con un risultato orribile ed inutilizzabile per 
utente finale.
Sono disperato... :-( sto cercando dappertutto le informazioni necessarie 
per aggirare questo problema, ma non riesco a trovarne da nessuna parte.
MSDN è un labirinto senza uscita... :(
Mi rivolgo a voi, sono sicuro che saprete darmi un aiuto.
Il mio obiettivo è rendere la mia applicazione *compatibile* con tutte le 
possibili personalizzazioni dell'utente, riuscendo ad allineare 
correttamente tutti gli oggetti della form *indipendentemente* dai settaggi 
personalizzati della macchina finale.
Spero nel vostro aiuto.
Grazie in anticipo a tutti, scusate la lunghezza del post.
B.
 

 nella form.
Prova a usare sempre i pixel e ScaleWidth/ScaleHeight al posto di Width e 
Height che lavorano sempre in twips.
Ciao 

 Height che lavorano sempre in twips.
Purtroppo no...
Che si usino i twips o i millimetri o i pixel, in VB6 il problema non si 
risolve... :-((
Fintanto che Windows è configurato con una dimensione dei font di sistema 
stabilita in un numero di DPI preciso e *non* arrotondato (ossia il 
96=normal, 120=large fonts, ma anche il 72 o 144) il problema non sussiste.
Ma da quando la M$ ha inventato quello stramaledetto cursore che permette di 
modificare la grandezza dei font di sistema in maniera "percentuale" (101%, 
102%, 103%...) sono iniziati i dolori!!
Ad esempio: spostando il cursore della dimensione del font di sistema a 
104%, Windows dice:
"Dimensione personalizzata: 104% del normale, 100 dpi"
Ma in REALTA' non è vero che sono 100 dpi, ma per la precisione sono 99.84.
Il calcolo esatto è:  96 / 100 * 104 = 99.84
Questo arrotondamento comporta uno sfasamento totale tra gli oggetti grafici 
e quelli che utilizzano del testo.
Infatti, tutti gli oggetti VB6 che contengono del testo (ossia listview, 
tabstrip, text, datagrid, combo, ecc...) perdono la possibilità di essere 
dimensionati in modo preciso, in quanto viene operato una specie di 
"arrotondamento" sulla dimensione dello stesso, per adattarsi alla reale 
dimensione del font di sistema stabilito.
E così succede che una Picture ed una Listview, entrambe con Width=3000, in 
realtà sullo schermo hanno una larghezza differente!!! In alcuni casi, anche 
molto differente... :-(
La Microsoft stessa, su MSDN, sconsiglia l'utilizzo della larghezza dei font 
personalizzata, in quanto potrebbe creare degli errori di allineamento in 
alcune applicazioni. A questo link, poi, fornisce indicazioni su come 
scrivere applicazioni che siano "High-DPI compliant":
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngdi/html/highdpiapp.asp
Non ditemi che non vi è mai capitato di vedere applicazioni dove un 
pulsante, ad un certo punto, si trova leggermente fuori della form... :-)
Comunque sto lavorando sul problema, e lo sto risolvendo.
So che moltissimi di voi lavorano in 
VB.NET
.
Leggendo l'msdn di M$, sembra che in questo nuovo ambiente di sviluppo il 
problema non si verifica.
Ma poiché io, come altre persone, lavoro ancora in VB6 e devo manutenere 
delle applicazioni già scritte e funzionanti (e vi prego... non ditemi di 
migrare le applicazioni in VB2003... ) devo comunque risolvere il problema 
in un altro modo.
Ripeto: ci sto riuscendo!
Se a qualcuno di voi interessa sapere come, fatemelo sapere che posterò qui 
la soluzione non appena avrò finito il mio lavoro.
Saluti a tutti.
B.

 in un altro modo.
Secondo me dovresti avvisare di non usare font a grandezza personalizzata.
Primo perchè non ho mai visto nessuno usarli, se uno deve aumentare i 
caratteri lo fa nella cartella "Aspetto".
Secondo, perchè credo che creino casini con molte altre app, mica solo alla 
tua.
Ciao 

 alla tua.
Lo so, Fabio, lo so eccome.... :-)
Ma l'utente (è un tedesco) mi ha detto che lui utilizza un portatile che ha 
una risoluzione "strana" (ora non mi ricordo esattamente quale) perché ha un 
monitor lcd tipo formato cinema.
Dice che usando la risoluzione nativa del suo monitor, gli oggetti di 
Windows sono troppo grossi... e così ha abbassato in toto tutta la GDI, 
portandola al 90% del normale (che sarebbe 96 dpi). Così (dice lui) tutto si 
vede bene... :-/
Che ci vuoi fare... ognuno fa le proprie scelte... :-(
Anche io sono sicuro che lui riscontrerà molti problemi grafici, 
nell'utilizzo delle applicazioni Windows.
Comunque, già che mi ci trovo, il mio obiettivo è quello di rendere la mia 
applicazione "compliant" a qualsiasi custom screen dpi.
E' un bel casino, credimi... ;-)
B.