Choix de la taille de la police

Résolu
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023 - 25 juil. 2010 à 10:28
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023 - 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

2 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
25 juil. 2010 à 13:42
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.
3
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023
25 juil. 2010 à 16:17
ok, je comprends le principe
mais comme tu le dis, ca fait un peu bidouille

merci
0
Rejoignez-nous