Newsgroup: it.comp.lang.visual-basic
Titolo: Installare Font a Run Time.

Ho un'applicazione in VB3 che usa dei font speciali.
Come posso fare per creare un disco di distribuzione che automaticamente
installi anche i fonts??
Grazie in anticipo,
Sauro

...

Con le api:
Per Win32:
Private Declare Function AddFontResource& Lib "gdi32" Alias
"AddFontResourceA" _
(ByVal lpFileName As String) 'Aggiunge il font
Private Declare Function RemoveFontResource& Lib "gdi32" Alias
"RemoveFontResourceA" _
(ByVal lpFileName As String) 'Rimuove il font
Per Win16:
Private Declare Function AddFontResource% Lib "gdi" (ByVal lpFilename As
Any) 'Aggiunge il font
Private Declare Function RemoveFontResource% Lib "gdi" (ByVal lpFilename As
Any) 'Rimuove il font
lpFileName č il file da aggiungere (con il percorso) e puň essere .FON,
.FNT, .TTF, or .FOT
Le funzioni ritornano 0.
Puoi usare l'api:
Win32:
Private Declare Function SendMessageBynum& Lib "user32" Alias "SendMessageA"
_
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam
As Long)
Win16:
Private Declare Function SendMessageBynum& Lib "user" Alias "SendMessage"  _
(ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer,
ByVal lParam As Long)
richiamandola cosě:
Call SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0)
per notificare a tutte le applicazioni che c'č stato un aggiornamento della
lista dei font installati.


Io avevo in giro questo pezzo di codice (riportato in fondo al msg). Non so
chi sia l'autore, ne' se funziona. Prova e fammi sapere.
Ti chiedo solo un favore... come forse saprai, gli utenti di questo NG anno
creato un sito web (Sito Comune), che contiene molto materiale utilissimo
per i programmatori VB (sorgenti, OCX/DLL etc...) tutto FREEWARE!
L'indirizzo del sito e': 
http://members.xoom.com/it_lang_vb
Se vuoi (non sei obbligato) e se ti siamo stati d'aiuto, potresti mettere il
codice in una funzione (e magari aggiungerci un piccolo programma di test),
cosi' lo mettiamo sul sito?
Per farlo pubblicare sul sito devi spedire il materiale al webmaster,
l'e-mail la trovi sulla pagina iniziale del sito.
grazie
--
Roal Zanazzi
z...@iol.it
Dim Ret%, Res&
Const WM_FONTCHANGE = &H1D
Const HWND_BROADCAST = &HFFFF
Const FontPath$ = "Arial.TTF"
Const FontRes$ = "Arial.FOT"
Const FontName$ = "Arial"
Const WinPath$ = "c:\windows"
Ret% = CreateScalableFontResource(0, FontRes$, FontPath$, WinPath$)
Ret% = AddFontResource(FontRes$)
Res& = SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0)
Ret% = WriteProfileString("fonts", FontName$ + " Arial (TrueType)",
FontRes$)


Questo codice e' stato scritto per Win16 (quindi VB3 e VB4/16bit).
Per Win32 (Windows 95 etc...), sarebbe cosi' (non serve il FontRes (che poi
e' il file .FOT):
Ret% = AddFontResource(FontPath$)
Res& = SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0)
Ora passiamo alle domande (in particolare a Golan Trevize, che ha postato
una risposta):
1) facendo un programmino di esempio, da mettere sul sito comune, ho
"giocato" un po' e ho scoperto che se copio semplicemente il file TTF nella
directory \Windows\Fonts, il font diviene utilizzabile da tutte le
applicazioni, quindi e' gia' installato, senza la chiamata all'API
AddFontResource(). Mi chiedo, e' proprio necessaria quell'API? Siamo sicuri
che non sia sufficiente copiare il font nella directory dei Fonts, con un
semplice FileCopy?
2) Nell'help delle API win32, viene specificato che l'API AddFontResource,
si aspetta il file del font nella directory SYSTEM, ma cio' non ha molto
senso in Windows95, dove i fonts dovrebbero essere messi nella directory
\Windows\Fonts. Qualcuno mi spiega?
3) Perche' tra le API win32 esiste ancora CreateScalableFontResource(), che
serve per creare il file .FOT, che serviva in Windows 3.1, ma non ha piu'
senso in Win95? Esiste solo per retro-compatibilita' (dall'help, non si
direbbe) o c'e' un aspetto del suo uso che mi e' sfuggito? E' necessario (e
quando) usarlo in Win32?
4) qualcuno di voi ha ancora Windows 3.1, cosi' puo' testare il programmino
di esempio, quando l'avro' finito (prima devo chiarire i punti qui sopra)?
grazie in anticipo
--
Roal Zanazzi
z...@iol.it

semplice FileCopy?
Per le altre due domande non saprei che dirti....
Per quanto riguarda la prima effettivamente l'avevo già notato anch'io che
copiando il file nella directory fonts, questo carattere viene
automaticamente installato.
Quindi il problema si risolve nell'uso di una api per cercare la cartella
delle fonts.
Mah....l'unica cosa è fare delle prove.
Prova a far copiare il font dal tuo programma durante il runtime e poi fai
in modo che un controllo (senza riavviare l'applicazione) utilizzi tale
carattere (tipo una rich text box).
Se funziona allora va bene (penso)!!!
Comunque, in generale, io ne so quanto te :)

 >semplice FileCopy?
Consiglio.
Sul sito comune c'e' il prj CartelleStd.zip con l'esempio delle api per ricavare il path delle cartelle usate dal sistema
operativo.
C'e' anche quella dei Font, e penso che per pulizia e compatibilita' vada usata quella.
-- 
Hi, Ciao
Ettore                 By -MES-
http://freeweb.aspide.it/freeweb/ilmes
 
(con OCX per stampare i Recordset)
Il sito comune di programmatori VB
http://members.xoom.com/it_lang_vb


Io l'ho gia' fatto chiamando l'API da DENTRO la funzione di installazione
font (cosi' e' tutto inglobato... information hiding :-)
Pero' mi serve sapere le risposte alle domande che ho posto, cosi' potevo
completare il progettino e mandarlo al Sito comune.
--
Roal Zanazzi
z...@iol.it