Yoyo@ | Salut,
Pour info, je tourne sous Windows XP SP2.
En faisant quelques tests de formattage de chaîne de caractères en utilisant la fonction GetTextExtentPoint32 qui est censée calculer la largeur de'une chaîne de caractère en utilisant la police dans le DC en cours, je me suis rendu compte que dans certains cas, cette fonction ne retournait pas la bonne valeur, en particulier lorsque ma chaîne finit par le caractère "f".
En isolant le problème, voici un bout de code (gestionnaire de messages Win32) qui permet facilement de voir le problème. Ce bout de code se contente de sélectionner du Arial d'une taille particulière, à écrire "f" à l'écran, et à côté d'indiquer la largeur retournée par GetTextExtentPoint32. (j'utilise un fond noir pour facilement mesurer la largeur réelle du caractère):
Code :
- LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HDC hdc;
- PAINTSTRUCT ps;
- HFONT hfont;
- LOGFONT lf = {-48};
- SIZE sz;
- TCHAR tmp[30];
- TCHAR* szTest = TEXT("f" );
- RECT rcClient;
- switch (message)
- {
- case WM_PAINT:{
- GetClientRect(hwnd, &rcClient);
- hdc = BeginPaint(hwnd, &ps);
- FillRect(hdc, &rcClient, (HBRUSH)GetStockObject(BLACK_BRUSH));
- lstrcpy(lf.lfFaceName, TEXT("Arial" ));
- hfont = CreateFontIndirect(&lf);
- SelectObject(hdc, hfont);
- TextOut(hdc, 5, 5, szTest, lstrlen(szTest));
- GetTextExtentPoint32(hdc, szTest, lstrlen(szTest), &sz);
- wsprintf(tmp, TEXT("Width: %d" ), sz.cx);
- TextOut(hdc, 15 + sz.cx, 5, tmp, lstrlen(tmp));
- SelectObject(hdc, GetStockObject(SYSTEM_FONT));
- DeleteObject(hfont);
- EndPaint(hwnd, &ps);
- return 0;}
- case WM_DESTROY:
- PostQuitMessage (0) ;
- return 0 ;
- }
- return DefWindowProc (hwnd, message, wParam, lParam) ;
- }
|
Si vous essayez le code suivant, vous verrez que l'appel à GetTextExtentPoint32 retourne 13 alors que la largeur réelle est de 15 pixels.
Voici une image pour illustrer le tout:
Donc, ma question: comment faire pour avoir la largeur exacte prise par ma chaîne de caractères? Message édité par Yoyo@ le 19-03-2007 à 17:06:38
|