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] )
$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é). |
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. |
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.
_WinAPI_CreateBuffer, _WinAPI_FreeMemory
Consultez GetGlyphOutline dans la librairie MSDN.
#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