Accueil > Forum > > > > choix de la taille de la police
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
|
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é
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|