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.