Comment faire pour calculer un rectangle englobant pour un String Text

IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.

203099
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Résumé
Dans la plupart des cas, il est nécessaire calculer la zone d'affichage occupée par une chaîne de texte particulier lors de la sortie vers un contexte d'affichage. Le code dans cet article illustre un moyen de dérivation de ces informations et renvoyer sous la forme d'un rectangle englobant.

Indépendamment de la rotation ou orientation du texte, le rectangle englobant n'est pas pivoté. Les côtés gauche et droit de l'axe de l'Y parallèle rectangle englobant et les côtés supérieur et inférieur parallèle à l'axe X. Il est dignes d'attention que le rectangle englobant retourné représente les limites de pixels de glyphes de texte plutôt que les étendues typographiques qui seraient utilisés pour la mise en forme du texte.
Plus d'informations
La fonction suivante renvoie un rectangle englobant pour une chaîne de texte. Pour cela par dessiner le texte sous la forme d'un chemin d'accès et puis récupérer les données comprenant le chemin d'accès et d'analyse pour l'étendue maximale et minimale.

Remarque : polices True Type uniquement sont prises en charge dans les chemins d'accès de sorte que cette fonction ne fonctionne qu'avec des polices True Type.

/********************************************************************  *                                                                   *  * FUNCTION:  GetTextBoundingRect()                                  *  *                                                                   *  * PURPOSE:   Get a bounding rectangle for a string of text output   *  *            to a specified coordinate in a DC using the currently  *  *            selected font                                          *  *                                                                   *  * NOTES:     The reference DC must have a True Type font selected   *  *                                                                   *  *********************************************************************/   BOOL GetTextBoundingRect(HDC    hDC,   // Reference DC                           int    x,     // X-Coordinate                           int    y,     // Y-Coordinate                           LPSTR  lpStr, // The text string to evaluate                           DWORD  dwLen, // The length of the string                            LPRECT lprc)  // Holds bounding rectangle  {      LPPOINT lpPoints;       LPBYTE lpTypes;      int i, iNumPts;        // Draw the text into a path      BeginPath(hDC);      i = SetBkMode(hDC, TRANSPARENT);      TextOut(hDC, x, y, lpStr, dwLen);      SetBkMode(hDC, i);      EndPath(hDC);        // How many points are in the path      iNumPts = GetPath(hDC, NULL, NULL, 0);      if (iNumPts == -1) return FALSE;        // Allocate room for the points      lpPoints = (LPPOINT)GlobalAlloc(GPTR, sizeof(POINT) * iNumPts);      if (!lpPoints) return FALSE;        // Allocate room for the point types      lpTypes = GlobalAlloc(GPTR, iNumPts);      if (!lpTypes) {          GlobalFree(lpPoints);          return FALSE;      }        // Get the points and types from the current path      iNumPts = GetPath(hDC, lpPoints, lpTypes, iNumPts);        // Even more error checking      if (iNumPts == -1) {          GlobalFree(lpTypes);          GlobalFree(lpPoints);          return FALSE;      }        // Initialize the rectangle      SetRect(lprc, 0xFFFFF, 0xFFFFF, 0, 0);      // Get the maximum/minimum extents from the path data      for (i=0; i<iNumPts; i++) {          if (lpPoints[i].x > lprc->right)  lprc->right  = lpPoints[i].x;          if (lpPoints[i].y > lprc->bottom) lprc->bottom = lpPoints[i].y;          if (lpPoints[i].x < lprc->left)   lprc->left   = lpPoints[i].x;          if (lpPoints[i].y < lprc->top)    lprc->top    = lpPoints[i].y;      }        GlobalFree(lpTypes);      GlobalFree(lpPoints);        return TRUE;  }				
Références
Pour plus d'informations sur les chemins d'accès, ce qu'ils sont et comment les utiliser, consultez l'article suivant dans la base de connaissances Microsoft :

128091SAMPLE : Comment utiliser des chemins d'accès pour créer des effets de texte
kbDSupport

Avertissement : Cet article a été traduit de manière automatique

Propriétés

ID d'article : 203099 - Dernière mise à jour : 01/09/2015 16:10:49 - Révision : 2.5

  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professionnel
  • Microsoft Platform Software Development Kit-January 2000 Edition
  • the operating system: Microsoft Windows XP 64-Bit Edition
  • kbnosurvey kbarchive kbmt kbdswgdi2003swept kbhowto KB203099 KbMtfr
Commentaires