Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
La funzione EnumFonts (Tutorial completo)
La funzione EnumFonts risponde alla specifica necessità di elencare tutti i tipi di carattere (fonts) che si hanno a disposizione. Per ciascun tipo di carattere, dotato di nome proprio (ad es. Verdana, Tahoma, Arial, Courier...), la funzione che stiamo trattando recupera tutte le informazioni e le specifiche relative a quel particolare font che ha in possesso e le passa all'applicazione. Naturalmente come vedremo in seguito la funzione ha la facoltà di processare le informazioni nel modo desiderato dall'utente. Questo processo inoltre è continuo e si interromperà solamente quando non ci sono più tipi di carattere da processare oppure quando la funzione ritornerà il valore 0. Vediamo la dichiarazione generale della funzione che ricordiamo ancora una volta, deve essere inserita in un nuovo modulo.

Declare Function EnumFonts Lib "gdi32" Alias "EnumFontsA" ( ByVal hDC As Long, _
ByVal lpsz As String, ByVal lpFontEnumProc As Long, _
ByVal lParam As Long) As Long

Fatto questo diamo una rapida occhiata ai parametri della funzione che, come si è potuto notare seguendo le guide complete sulle altre funzioni API, spesso si ripetono e mantengono caratteristiche simili per non dire uguali.

hDC rappresenta il contesto univoco dell'oggetto che deve contenere la lista dei tipi di carattere. Ecco l'esempio:

Me.hDC

lpFaceName Questo parametro punta ad una stringa partcolare il cui ultimo carattere è 0.
La stringa specifica il nome del tipo di carattere o font che si sta processando.
lpFontFunc Questo parametro punta invece alla funzione di ritorno che si vedrà in seguito. La funzione di ritorno è quella che invia i dati relativi ai tipi di carattere all'applicazione
lParam Punta alle informazioni passate dalla funzione all'applicazione

Vediamo finalmente di fare un esempio. Vogliamo creare un'applicazione che elenchi tutti i possibili fonts a disposizione. Scelto un tipo di carattere, lo si potrà utilizzare per modificare o scrivere ex novo un testo all'interno di una RichTextBox. Vediamo passo passo come fare:
Cominciamo ad aprire un nuovo progetto. Ci troveremo di fronte alla finestra del codice della nuova form, codice che sarà ancora vuoto. Aggiungiamo allora queste linee, che ci danno la possibilità di richiamare la nostra funzione EnumFonts:

EnumFonts Me.hDC, vbNullString, AddressOf EnumFontProc, 0

Il codice qui sopra può essere inserito in corrispondenza dell'evento Form_Load:

Private Sub Form_Load()
EnumFonts Me.hDC, vbNullString, AddressOf EnumFontProc, 0
End Sub

Bene, adesso inseriamo nella form una ListBox ed una RichTextBox. La scelta di posizione e dimensione di questi due oggetti è naturalmente del tutto personale.
Fatto ciò lasciamo la form momentaneamente a riposo ed apriamo un modulo che verrà denominato automaticamente Module1.bas.
All'interno di tale modulo aggiungiamo la dichiarazione della costante LF_FACESIZE

Private Const LF_FACESIZE = 32

Poi aggiungiamo tutte le informazioni che vengono processate per ogni singolo tipo di carattere, ossia: lfHeight, lfWidth, lfEscapement, Orientation, lfWeight lfItalic, lfUnderline, lfStrikeOut, lfCharSet, lfOutPrecision, lfClipPrecision, lfQuality, lfPitchAndFamily e per ultimo lfFaceName:

Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName(LF_FACESIZE) As Byte
End Type

ed aggiungiamo, sempre nelle dichiarazioni generali del modulo Module1.bas la dichiarazione della nostra funzione EnumFonts come abbiamo già visto proprio all'inizio della lezione:

Declare Function EnumFonts Lib "gdi32" Alias "EnumFontsA" ( ByVal hDC As Long, _
ByVal lpsz As String, ByVal lpFontEnumProc As Long, _
ByVal lParam As Long) As Long

Per concludere le dichiarazioni generali aggiungiamo anche la dichiarazione della funzione CopyMemory che vedremo nelle guide successive e sulla quale per il momento non spenderemo neanche una parola:

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, _
pSrc As Any, ByVal ByteLen As Long)

Terminate finalmente le dichiarazioni generali del modulo, facciamo un breve riassunto di come si presenta il modulo fino a questo punto (e magari aggiungiamo anche un bell'Option Explicit che male non ha mai fatto):

Private Const LF_FACESIZE = 32
Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName(LF_FACESIZE) As Byte
End Type
Declare Function EnumFonts Lib "gdi32" Alias "EnumFontsA" ( ByVal hDC As Long, _
ByVal lpsz As String, ByVal lpFontEnumProc As Long, _
ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, _
pSrc As Any, ByVal ByteLen As Long)
Option Explicit

Sviluppiamo adesso la nostra funzione che ha lo scopo di processare le informazioni dei tipi di caratteri che devono essere passate all'applicazione:

Function EnumFontProc(ByVal lplf As Long, ByVal lptm As Long, _
ByVal dwType As Long, ByVal lpData As Long) As Long
End Function

All'interno di questa funzione dichiariamo le variabili che ci serviranno:

Dim LF As LOGFONT
Dim FontName As String
Dim ZeroPos As Long

Ed infine la funzione vera e propria:

CopyMemory LF, ByVal lplf, LenB(LF)
FontName = StrConv(LF.lfFaceName, vbUnicode)
ZeroPos = InStr(1, FontName, Chr$(0))
If ZeroPos > 0 Then FontName = Left$(FontName, ZeroPos - 1)
Form1.List1.AddItem FontName
EnumFontProc = 1

Il modulo completo si presenterà quindi così:

Private Const LF_FACESIZE = 32
Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName(LF_FACESIZE) As Byte
End Type
Declare Function EnumFonts Lib "gdi32" Alias "EnumFontsA" ( ByVal hDC As Long, _
ByVal lpsz As String, ByVal lpFontEnumProc As Long, _
ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, _
pSrc As Any, ByVal ByteLen As Long)
Option Explicit
Function EnumFontProc(ByVal lplf As Long, ByVal lptm As Long, _
ByVal dwType As Long, ByVal lpData As Long) As Long
Dim LF As LOGFONT
Dim FontName As String
Dim ZeroPos As Long
CopyMemory LF, ByVal lplf, LenB(LF)
FontName = StrConv(LF.lfFaceName, vbUnicode)
ZeroPos = InStr(1, FontName, Chr$(0))
If ZeroPos > 0 Then FontName = Left$(FontName, ZeroPos - 1)
Form1.List1.AddItem FontName
EnumFontProc = 1
End Function

Facendo girare il programma vediamo che la ListBox si riempie dei nomi che corrispondono ciascuno ad un tipo di carattere.
Dunque il primo passo è fatto.
Nella form principale andiamo ad aggiungere l'evento List1_Click, tramite il quale la nostra applicazione (da distribuire shareware, mi raccomando!) capirà quale font utilizzare nel momento in cui l'utente andrà a scrivere nella RichTextBox:

Private Sub List1_Click()
RichTextBox1.SelFontName = List1.List(List1.ListIndex)
End Sub

Ed il gioco è fatto. Per scaricare l'esempio fare riferimento alla rubrica ESEMPI.
Noi ci aggiorniamo alla prossima lezione. Ciao.

Archivio:
Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
Proponi un argomento

Visual Basic Italia© copyright 2000 - tutti i diritti riservati
E-mail:
vbitalia@libero.it <% =Now %>