Comment faire pour calculer un rectangle englobant pour un String Text

Traductions disponibles Traductions disponibles
Numéro d'article: 203099 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

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

Propriétés

Numéro d'article: 203099 - Dernière mise à jour: jeudi 22 février 2007 - Version: 2.5
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • 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
Mots-clés : 
kbmt kbdswgdi2003swept kbhowto KB203099 KbMtfr
Traduction automatique
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.
La version anglaise de cet article est la suivante: 203099
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com