begin process at 2012 05 28 08:23:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

GUI

 > 

choix de la taille de la police


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

choix de la taille de la police

dimanche 25 juillet 2010 à 10:28:44 | choix de la taille de la police

mogwai93

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
dimanche 25 juillet 2010 à 13:42:50 | Re : choix de la taille de la police

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
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) :

Code C/C++ :
#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.
dimanche 25 juillet 2010 à 16:17:24 | Re : choix de la taille de la police

mogwai93

ok, je comprends le principe
mais comme tu le dis, ca fait un peu bidouille

merci


Cette discussion est classée dans : taille, texte, choix, police, largeur


Répondre à ce message

Sujets en rapport avec ce message

Taille de la Police [ par victorcoasne ] Bonjour,Je veux écrire sur une image un texte.Je me sert de la librairie GD.J'ai par exemple un carré de 50px sur 100px et je veux écrire un texte ("L buffer pour editeur de texte [ par dyroj ] hello all, je voudrai créer un editeur de texte, et pour cela j'ai besoin d'un buffer(une variable char) qui contiendra toute la taille du fichier(qui hauteur et largeur de texte [ par salim_samir ] salut à tous comment je peut modifie la taille d'une texte affiché sur l'ecran en langage c,par exemple printf("salut"); comment je peut modifie le mo Besoin d'aide [ par pelodelyon ] Voilà j'ai un petit problème je bloque dans ma fonction winmain, quand j'ouvre un fichier en double cliquant dessus et en ayant sélectionner mon progr [CPP] calcul de la longueur du texte en fonction de la largeur du label [ par Titi035 ] Salut, J'ai un texte que je souhaite afficher dans un label. Si le texte est trop grand, j'aimerais qu'il soit tronqué et qu'il se termine par "...". Probleme Erreur Segmentation [ par kyubi6363 ] Voila sa compile bien mais erreur de segmentation quand je lance. Pouvais vous me dire ce qu'il ne va pas :) #include #include #define TAILLE_LARG Caractéristiques police de caractères : taille, largeur des caractères [ par lectpe ] Bonjour à tous. L'application que je suis en-train de réaliser doit pouvoir gérer le changement de la police d'écriture. J'ai utilisé EnumFonts pour taille fenêtre [ par Lustuc ] Bonjour, J'ai plusieurs fenêtres de tailles différentes, je cherche à imposer à toutes les fenêtre la taille d'une des fenêtres. Je recheche donc 2 Champ edit [ par mogwai93 ] bonjour j'ai un champ edit d'une certaine taille sur l'ecran. Lorsque je rentre du texte via l'affichage, j'ai une limitation qui semble correspondr taille d'un LPCVOID [ par wallegen ] DWORD myfprintf ( LPCVOID texte ) {            WriteFile ( fichier, texte,strlen(texte), &taille, NULL );} J'ai simplifié la fonction pour la compré


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,343 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales