Choix de la taille de la police [Résolu]

Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015
- - Dernière réponse : mogwai93
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015
- 25 juil. 2010 à 16:17
Bonjour

J'ai un static d'une largeur définie
A l'intérieur de celui-ci, je place un texte dans une police de mon choix (on va faire simple, on va dire Arial)

je voudrais que la taille de la police s'adapte à la longueur du texte :
par exemple
si ma taille par défaut est 12 et que le texte ne déborde pas alors la taille reste à 12
si ca déborde (ou si ca saute une ligne), que la police diminue pour s'adapter

mon texte est la plupart du temps 1 mot (ou ne dépasse pas 2 lignes avec la largeur que j'ai)


pour le moment, je teste le strlen du texte, mais comme chaque lettre n'a pas la même largeur que les autres, ca fonctionne
mais ca reste un peu bidouille à mon goût


s'il y a une solution (ou de contournement)

Merci
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
8
3
Merci
Salut,

Je ne sais pas si quelque chose de mieux existe, mais voilà une méthode moche : tu peux bricoler à base de GetTextExtentPoint32 en essayant plusieurs tailles de font jusqu'à ce que l'une d'elle colle.

A l'arrache (Un edit dont la taille de font varie pour que tout le texte tapé dedans reste visible) :

#ifdef UNICODE
#define _T(x) L ## x
typedef unsigned short TCHAR;
#else
#define _T(x) x
typedef char TCHAR;
#endif

#include <windows.h>

HINSTANCE _hThisInstance;              /* Handle du module                    */
HWND _hWnd;                            /* Handle de la fenêtre                */
HWND _hEdit;                           /* Handle sur l'edit                   */
LPTSTR _lpAppName = _T("Font");        /* Nom de l'appli                      */

HFONT _hMainFont = NULL;               /* Police de base                      */

WORD __stdcall Err_ShowLast(TCHAR* lpTitle)
{
  DWORD nLastError;
  LPTSTR lpMessageBuffer;

  nLastError = GetLastError();

  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (TCHAR*)(void*)&lpMessageBuffer, 0, NULL);

  MessageBox(NULL, lpMessageBuffer, lpTitle, MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);
  return 1;
}

HFONT __stdcall GetFont(int nHeight)
{
  NONCLIENTMETRICS metrics; /* Récupération des métriques                     */
  HFONT hResult;

  hResult = NULL;

  metrics.cbSize = sizeof(NONCLIENTMETRICS);
  if (! SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
      sizeof(NONCLIENTMETRICS), &metrics, 0))
  goto the_end;

  metrics.lfCaptionFont.lfHeight = nHeight;
  metrics.lfCaptionFont.lfWeight = FW_BOLD;
  hResult = CreateFontIndirect(&metrics.lfCaptionFont);

the_end:
  return hResult;
}

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
  int bHandled;               /* Pour savoir si le message est traité          */
  TCHAR lpText[1000];         /* Pour récupérer le texte de l'edit             */
  int nStrLen;                /* Taille du texte de l'edit                     */
  SIZE textSize;              /* Taille du texte en unités logiques            */
  HDC hEditDc;                /* Handle sur le DC                              */
  HFONT _hOldFont;            /* Orginal DC font                               */
  long nResult;
  int nI;

  nResult = 0;
  bHandled = 0;
  switch (nMessage)
  {
    case WM_COMMAND:
      if (((HANDLE)lParam _hEdit) && (HIWORD(wParam) EN_CHANGE))
      {
        GetWindowText(_hEdit, lpText, 1000);
        nStrLen = lstrlen(lpText);
        for (nI = 80; nI > 0; nI--)
        {
          DeleteObject(_hMainFont);
          _hMainFont = GetFont(nI);
          SendMessage(_hEdit, WM_SETFONT, (long)_hMainFont, TRUE);
          hEditDc = GetDC(_hEdit);
          _hOldFont = SelectObject(hEditDc, _hMainFont);
          GetTextExtentPoint32(hEditDc, lpText, nStrLen, &textSize);
          SelectObject(hEditDc, _hOldFont);
          ReleaseDC(_hEdit, hEditDc);

          if (textSize.cx < 450) break;
        }
      }
      break;
    case WM_DESTROY:
      /* On signale que le thread va s'arrêter */
      PostQuitMessage(0);
      bHandled = 1;
      break;
  }
  if (! bHandled)
    nResult = DefWindowProc(hWnd, nMessage, wParam, lParam);
  return nResult;
}

HWND __stdcall CreateMyStatic()
{
  HWND hResult;

  hResult = CreateWindowEx(0, _T("EDIT"), _T("Tapez ici !"),
                           WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL,
                           10, 10, 450, 100,
                           _hWnd, NULL, _hThisInstance, NULL);
  if (! hResult) goto the_end;
  SendMessage(hResult, WM_SETFONT, (long)_hMainFont, 0);

the_end:
  return hResult;
}

BOOL __stdcall CreateMyWindow()
{
  WNDCLASSEX wincl;       /* Classe de la fenêtre utilisée                    */
  int nResult;

  nResult = 0;

  /* Création de la classe de fenêtre */
  wincl.cbSize = sizeof(WNDCLASSEX);
  wincl.style = 0;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.cbClsExtra = 0;
  wincl.cbWndExtra = 0;
  wincl.hInstance = _hThisInstance;
  wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
  wincl.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
  wincl.lpszMenuName = 0;
  wincl.lpszClassName = _lpAppName;
  wincl.hIconSm = NULL;

  /* Enregistrement de la classe */
  if (! RegisterClassEx(&wincl)) goto the_end;

  /* Création de la fenêtre */
  _hWnd = CreateWindowEx(0, _lpAppName, _lpAppName,
                         WS_OVERLAPPED | WS_SYSMENU,
                         CW_USEDEFAULT, CW_USEDEFAULT, 500, 200,
                         HWND_DESKTOP, NULL, _hThisInstance, NULL);
  if (! _hWnd) goto the_end;

  _hEdit = CreateMyStatic();
  if (! _hEdit) goto the_end;

  /* Affichage de la fenêtre */
  ShowWindow (_hWnd, SW_SHOW);

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Main
 */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  MSG message;                        /* Messages envoyés à l'application     */
  int nResult;

  /* Récupération du handle du module */
  _hThisInstance = hInstance;

  _hMainFont = GetFont(80);

  if (! CreateMyWindow())
  {
    nResult = Err_ShowLast(_T("Cannot create main window"));
    goto the_end;
  }

  /* Boucle de traitement des messages */
  while (GetMessage(&message, NULL, 0, 0))
  {
    TranslateMessage(&message);
    DispatchMessage(&message);
  }
  nResult = message.wParam;

the_end:
  if (_hMainFont != NULL)
    DeleteObject(_hMainFont);
  return nResult;
}



Une première amélioration serait de partir de la taille précédente comme base de travail, plutôt que de commencer à 80 en dur.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
ok, je comprends le principe
mais comme tu le dis, ca fait un peu bidouille

merci
Commenter la réponse de mogwai93