;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
;     EnumFontNames.au3
;
;     Lists installed fonts in a ListBox
;     Written by Greenhorn 2011
;
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListboxConstants.au3>
#include <Constants.au3>


; --- $LOGFONT
Global Const $LOGFONT = _
	"LONG lfHeight;"& _
	"LONG lfWidth;"& _
	"LONG lfEscapement;"& _
	"LONG lfOrientation;"& _
	"LONG lfWeight;"& _
	"BYTE lfItalic;"& _
	"BYTE lfUnderline;"& _
	"BYTE lfStrikeOut;"& _
	"BYTE lfCharSet;"& _
	"BYTE lfOutPrecision;"& _
	"BYTE lfClipPrecision;"& _
	"BYTE lfQuality;"& _
	"BYTE lfPitchAndFamily;"& _
	"WCHAR lfFaceName[32];"


; --- $ENUMLOGFONTEX
Global Const $ENUMLOGFONTEX = _
	$LOGFONT& _
	"WCHAR   elfFullName[64];"& _
	"WCHAR   elfStyle[32];"& _
	"WCHAR   elfScript[32];"

; --- $NEWTEXTMETRIC
Global Const $NEWTEXTMETRIC = _
	"LONG tmHeight;"& _
	"LONG tmAscent;"& _
	"LONG tmDescent;"& _
	"LONG tmInternalLeading;"& _
	"LONG tmExternalLeading;"& _
	"LONG tmAveCharWidth;"& _
	"LONG tmMaxCharWidth;"& _
	"LONG tmWeight;"& _
	"LONG tmOverhang;"& _
	"LONG tmDigitizedAspectX;"& _
	"LONG tmDigitizedAspectY;"& _
	"WCHAR tmFirstChar;"& _
	"WCHAR tmLastChar;"& _
	"WCHAR tmDefaultChar;"& _
	"WCHAR tmBreakChar;"& _
	"BYTE tmItalic;"& _
	"BYTE tmUnderlined;"& _
	"BYTE tmStruckOut;"& _
	"BYTE tmPitchAndFamily;"& _
	"BYTE tmCharSet;"& _
	"DWORD ntmFlags;"& _
	"UINT ntmSizeEM;"& _
	"UINT ntmCellHeight;"& _
	"UINT ntmAvgWidth;"


; --- $FONTSIGNATURE
Global Const $FONTSIGNATURE = _
	"DWORD fsUsb[4];"& _
	"DWORD fsCsb[2];"

; --- $NEWTEXTMETRICEX
Global Const $NEWTEXTMETRICEX = _
	$NEWTEXTMETRIC& _
	$FONTSIGNATURE


Global $ANSI_CHARSET    = 0
Global $DEFAULT_CHARSET = 1

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл


; Global IDs of controls
Global $ID_LISTBOX1


Global $hFontEnumProc = DllCallbackRegister ("EnumFontNames", "int", "ptr;ptr;DWORD;LPARAM")

; Start the main function
Exit (Au3Main ( ))


; The script's main function
Func Au3Main ( )

	Local $hwnd


	$hwnd = GUICreate ("EnumFontNames Demo", 300, 250, -1, -1, BitOR($WS_DLGFRAME, $WS_SYSMENU))

	$ID_LISTBOX1 = GUICtrlCreateList ("", 20, 20, 260, 180)

	; Fill the ListBox with the font names
	FillFontListBox (GUICtrlGetHandle ($ID_LISTBOX1))

	GUISetState (@SW_SHOW, $hwnd)


	While (TRUE)

		Switch (GUIGetMsg (FALSE))

			Case $GUI_EVENT_CLOSE
				DllCallbackFree ($hFontEnumProc)
				ExitLoop
		EndSwitch
	WEnd

	Return 0

EndFunc

; Function to fill the ListBox with the font names
Func FillFontListBox ($hwndList)

	Local $hdc = GetDC ($hwndList)
	Local $lf  = DllStructCreate ($LOGFONT)


	DllStructSetData ($lf, "lfCharSet", $ANSI_CHARSET)
	DllStructSetData ($lf, "lfFaceName", Chr(0), 1)
	DllStructSetData ($lf, "lfPitchAndFamily", 0)

	EnumFontFamiliesEx ($hdc, DllStructGetPtr ($lf), DllCallbackGetPtr ($hFontEnumProc), 0, 0)

	ReleaseDC ($hwndList, $hdc)

EndFunc

; Callback function to enumerate the installed fonts
Func EnumFontNames ($lpelfe, $lpntme, $dwFontType, $lParam)

	Local $elf = DllStructCreate ($ENUMLOGFONTEX, $lpelfe)
	Local $lpszName = DllStructGetPtr ($elf, "lfFaceName")


;~ 	If (DllStructGetData ($elf, "lfFaceName", 1) == '@') Then _
;~ 		Return 1

	; Check if font name is already listed in the box
	If (GUICtrlSendMsg ($ID_LISTBOX1, $LB_FINDSTRING, 0, $lpszName) == $LB_ERR) Then

		GUICtrlSendMsg ($ID_LISTBOX1, $LB_ADDSTRING, 0, $lpszName)
	EndIf

	Return 1

EndFunc



;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

Func EnumFontFamiliesEx ($hdc, $lpLogfont, $lpEnumFontFamExProc, $lParam, $dwFlags)

	Local $aRes = DllCall ("gdi32.dll", "INT", "EnumFontFamiliesExW", _
								"HANDLE", $hdc, _
								"ptr", $lpLogfont, _
								"ptr", $lpEnumFontFamExProc, _
								"LPARAM", $lParam, _
								"DWORD", $dwFlags)
	Return $aRes[0]

EndFunc

Func GetDC ($hwnd)

	Local $aRes = DllCall ("user32.dll", "HANDLE", "GetDC", "HWND", $hwnd)
	Return $aRes[0]

EndFunc

Func ReleaseDC ($hwnd, $hdc)

	Local $aRes = DllCall ("user32.dll", "int", "ReleaseDC", "HWND", $hwnd, "HANDLE", $hdc)
	Return $aRes[0]

EndFunc

;лллллллллллллллллллллллллллллллл End Of File ллллллллллллллллллллллллллллллллл
