Pourquoi la valeur renvoyée par getextentpoint32 reste-t-elle la même quelle que soit la taille de police actuelle ?

la programmation


Je développe cette application et afin de garantir que le contenu est ajusté à la taille de la page, l’application utilise la taille de police actuelle et la valeur renvoyée par GetTextExtentPoint32 pour ajuster la taille de la page en alimentant la sortie dans une boucle while. J’ai été plutôt choqué de découvrir que GetExtentPoint32 continuait de renvoyer la même valeur malgré la diminution de la taille de la police. Pourquoi est-ce ainsi, comment puis-je résoudre ce défi.

Les codes correspondants sont indiqués ci-dessous :

C++
GetTextExtentPoint32(hdc, wstSchoolName11.c_str(), lstrlen(wstSchoolName11.c_str()), &size);
if ((iTextLeft + size.cx) > (iPaperWidth - iPictureWidth - iOffsetX))
	{
		iFontSize--;

		hNewFont = CreateAppFont(iFontSize, FW_BOLD);
		hOldFont = (HFONT)SelectObject(hdc, hNewFont);
		GetTextMetrics(hdc, &tm);
		//int iTextTop11 = iTop + iOffsetY;
		//int iTextLeft11 = iImageLeft + iPictureWidth + 5 * dOneMMX;
		wstring wstSchoolName11 = utf8_decode(stSchoolName);
		CharUpper(&wstSchoolName11[0]);
		//SIZE size11;
		GetTextExtentPoint32(hdc, wstSchoolName11.c_str(), lstrlen(wstSchoolName11.c_str()), &size);
	}
	else
	{
		bMaximumWith = true;
	}
C++
int iWindowExtX = 1000 * GetDeviceCaps(hDC,HORZSIZE);
    int iWindowExtY = 1000 * GetDeviceCaps(hDC, VERTSIZE);

    int iViewPortX = GetDeviceCaps(hDC, HORZRES);
    int iViewPortY = GetDeviceCaps(hDC, VERTRES);

    SetMapMode(hDC, MM_ISOTROPIC);
    SetWindowExtEx(hDC, iWindowExtX, iWindowExtY, nullptr);
    SetViewportExtEx(hDC, iViewPortX, iViewPortY, nullptr);

La définition de l’application CreateFont est la suivante. Y a-t-il quelque chose qui ne va pas ?

C++
HFONT CreateAppFont(int cHeight, int cWeight, DWORD bItalic = 0, int cEscapement = 0, DWORD bUnderline = 0, LPCWSTR pszFaceName = L"Times New Roman");


HFONT CreateAppFont(int cHeight, int cWeight, DWORD bItalic, int cEscapement, DWORD bUnderline, LPCWSTR pszFaceName)
{
	return CreateFont(cHeight, 0, cEscapement, cEscapement, cWeight, bItalic, bUnderline, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
		CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, pszFaceName);

	
}

Ce que j’ai essayé :

J’ai passé un temps raisonnable au débogage. Le résultat a nécessité ce post.

Solution 1

Le Fonction GetTextExtentPoint32A (wingdi.h) – Applications Win32 | Microsoft Apprendre[^] renvoie la taille du texte dans unités logiques. Les fonctions d’affichage de texte utilisent ce nombre multiplié par la taille de la police pour calculer l’espace réel requis pour l’affichage.

Eh bien, je viens de tester cela et les valeurs de taille reflètent la police utilisée. Je pense que vous devez examiner de plus près ce qui se passe dans votre code, avec une référence spécifique au CreateAppFont fonction.

コメント

タイトルとURLをコピーしました