UDF > WinAPIEx > GDI > Font & Text >


_WinAPI_GetGlyphOutline

Obtient le contour ou le bitmap d'un caractère dans une police TrueType

#include <WinAPIGdi.au3>
_WinAPI_GetGlyphOutline ( $hDC, $sChar, $iFormat, ByRef $pBuffer [, $tMAT2 = 0] )

Paramètres

$hDC Le handle du contexte de périphérique dans lequel la police est sélectionnée.
$sChar Le caractère pour lequel les données doivent être retournées.
$iFormat Le format des données à extraire.
Ce paramètre peut prendre l'une des valeurs suivantes:
    $GGO_BEZIER
    $GGO_BITMAP
    $GGO_GLYPH_INDEX
    $GGO_GRAY2_BITMAP
    $GGO_GRAY4_BITMAP
    $GGO_GRAY8_BITMAP
    $GGO_METRICS
    $GGO_NATIVE
    $GGO_UNHINTED
$pBuffer Contiendra un pointeur sur un bloc de mémoire (buffer) qui reçoit les données du contour ou du bitmap.
Optionnellement, vous pouvez définir ce paramètre à 0 avant l'appel de fonction, la fonction va alors allouer le bloc de mémoire requis elle-même.
Sinon, il doit être un pointeur mémoire valide retourné par la fonction _WinAPI_CreateBuffer(), ou en appelant auparavant cette fonction.
Si $GGO_METRICS est spécifié, ce paramètre est ignoré, et la fonction retourne seulement les informations sur un glyphe (voir ci-dessous).
$tMAT2 [optionnel] La structure $tagMAT2 spécifiant une matrice de transformation pour le caractère.
Si ce paramètre est 0 (par défaut), la transformation ne sera pas utilisé (elle est la matrice de l'identité).

Valeur de retour

Succès: Retourne la structure $tagGLYPHMETRICS contenant des informations sur la position et l'orientation du glyphe,
@extended retourne le nombre d'octets copiés dans la mémoire tampon (s'il elle est utilisée), en octets.
Échec: Définit @error <> 0.

Remarques

Notez que, pour les valeurs $GGO_GRAY..., la fonction retourne un bitmap glyphe qui contient n^2+1 (carré de n plus un) niveaux de gris.

Le bitmap glyphe retourné par _WinAPI_GetGlyphOutline() quand $GGO_BITMAP est spécifié est un bitmap monochrome, rangée orientée, DWORD aligné.
Lorsque $GGO_GRAY2_BITMAP est spécifié, le bitmap retourné est un tableau, orienté par rangée, aligné sur DWORD, d'octets dont les valeurs vont de 0 à 4.
Lorsque $GGO_GRAY4_BITMAP est spécifié, le bitmap retourné est un tableau, orienté par rangée, aligné sur DWORD, d'octets dont les valeurs vont de 0 à 16.
Lorsque $GGO_GRAY8_BITMAP est spécifié, le bitmap retourné est un tableau, orienté par rangée, aligné sur DWORD, d'octets dont les valeurs varient entre 0 et 64.

Lorsque vous n'avez plus besoin de la mémoire tampon allouée par cette fonction, vous devez appeler la fonction _WinAPI_FreeMemory() (ne pas utiliser d'autres routines mémoire) pour libérer la mémoire occupée.

En relation

_WinAPI_CreateBuffer, _WinAPI_FreeMemory

Voir aussi

Consultez GetGlyphOutline dans la librairie MSDN.

Exemple

#include <APIGdiConstants.au3>
#include <FontConstants.au3>
#include <GUIConstantsEx.au3>
#include <SendMessage.au3>
#include <StaticConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIGdiDC.au3>
#include <WinAPIHObj.au3>
#include <WinAPIMem.au3>
#include <WindowsConstants.au3>

; Crée une police logique ("Times") et récupérer les bits du bitmap d'un caractère aléatoire
Local $hDC = _WinAPI_CreateCompatibleDC(0)
Local $hFont = _WinAPI_CreateFont(512, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Times')
Local $hSv = _WinAPI_SelectObject($hDC, $hFont)
Local $pData = 0
Local $tGM = _WinAPI_GetGlyphOutline($hDC, ChrW(Random(65, 90, 1)), $GGO_BITMAP, $pData)
Local $W = DllStructGetData($tGM, 'BlackBoxX')
Local $H = DllStructGetData($tGM, 'BlackBoxY')
_WinAPI_SelectObject($hDC, $hSv)
_WinAPI_DeleteObject($hFont)

; Créer un bitmap de 1 bit par pixel
Local $hBmp = _WinAPI_CreateBitmap(32 * Ceiling($W / 32), $H, 1, 1, $pData)

; Coupe le bitmap à la taille requise et le colore
Local $aColorTable[2] = [0xFFFFFF, 0xC00000]
Local $hDib = _WinAPI_CreateDIB($W, $H, 1, _WinAPI_CreateDIBColorTable($aColorTable), 2)
$hSv = _WinAPI_SelectObject($hDC, $hDib)
_WinAPI_DrawBitmap($hDC, 0, 0, $hBmp, $MERGEPAINT)
_WinAPI_SelectObject($hDC, $hSv)
_WinAPI_DeleteObject($hBmp)

; Libère les ressources (inutile)
_WinAPI_FreeMemory($pData)
_WinAPI_DeleteDC($hDC)

; Créer une GUI
Local $hForm = GUICreate('Test '& StringReplace(@ScriptName, '.au3', '()'), $W, $H)
Local $idPic = GUICtrlCreatePic('', 0, 0, $W, $H)
Local $hPic = GUICtrlGetHandle($idPic)

; Définit le bitmap dans le contrôle Picture
_SendMessage($hPic, $STM_SETIMAGE, 0, $hDib)
$hBmp = _SendMessage($hPic, $STM_GETIMAGE)
If $hBmp <> $hDib Then
    _WinAPI_DeleteObject($hDib)
EndIf

; Affiche la GUI
GUISetState(@SW_SHOW)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE