Breite eines Textstrings herausfinden



  • Hallo Leute,

    Ich versuche gerade, die Breite (in Pixeln) eines Textstrings herauszufinden, aber das scheint leider nicht so zu klappen wie es soll.

    In meinem Progrmm soll der Bediener einen Text eingeben, dieser Text wird in einem STATIC-Textfeld fester Breite angezeigt. Nun möchte ich die Schriftgröße so wählen, daß möglichst die gesamte Breite meines Textfeldes ausgenutzt wird. Dazu wollte ich den Font verstellen.

    Hier mein Versuch:

    //hBigFont und hTxtHinweis sind Klassenvariablen von MyClass
    void MyClass::SetHinweisText(char* szHinweis)
    {
    	int lfHeight = 45;
    	if(!hBigFont)
    	{
    		LOGFONT lf;
    		memset(&lf, 0, sizeof(LOGFONT));
    		lf.lfHeight = lfHeight;
    		hBigFont = ::CreateFontIndirect(&lf);
    	}
    	::SendMessage(hTxtHinweis, WM_SETFONT, (WPARAM) hBigFont, FALSE);
    	::SetWindowText(hTxtHinweis, szHinweis);
    	int iLen = strlen(szHinweis);
    	if(iLen < 10)
    		return;
    	RECT r; ::GetWindowRect(hTxtHinweis, &r);
    	int breite = (r.right - r.left) * 19 / 20;
    	for(;;)
    	{
    		HDC hdc = ::GetDC(hTxtHinweis);
    		SIZE strsize;
    		BOOL gtep = ::GetTextExtentPoint32(hdc, szHinweis, iLen, &strsize);
    		::ReleaseDC(hTxtHinweis, hdc);
    		if(!gtep || (strsize.cx < breite))
    			break;
    		lfHeight--;
    		::DeleteObject(hBigFont);
    		LOGFONT lf;
    		memset(&lf, 0, sizeof(LOGFONT));
    		lf.lfHeight = lfHeight;
    		hBigFont = ::CreateFontIndirect(&lf);
    		::SendMessage(hTxtHinweis, WM_SETFONT, (WPARAM) hBigFont, FALSE);
    	}
    }
    

    Wenn ich nun bspw. als Hinweistext "Hallo Leute, wie geht's?" bringen möchte, dann sagt mir VC++, daß strsize.cx=196 und breite=242, aber der Text wird nicht vollständig im Textfeld angezeigt, sondern geclipt.

    Wer kann mir helfen? Danke!!!


  • Mod

    Evtl. reservier das static selbst ein oder zwei Pixel als Rand. Versuch mal den Stil SS_LEFTNOWORDWRAP.

    Ach ja und DrawText mit DT_CALCRECT kannst Du auch noch verwenden, Evtl. ist da noch ein kleiner Unterschied zu GetTextExtent32



  • So, ich habe es inzwischen selber gefunden:

    Man muß noch einfügen, daß der neue Font auch ausgewählt wird:

    HDC hdc = ::GetDC(hTxtHinweis);
    		HFONT hFontOld = (HFONT) ::SelectObject(hdc, hBigFont); //Font auswaehlen
    		SIZE strsize;
    		BOOL gtep = ::GetTextExtentPoint32(hdc, szHinweis, iLen, &strsize);
    		::SelectObject(hdc, hFontOld); //Font wieder zuruecksetzen
    		::ReleaseDC(hTxtHinweis, hdc);
    

    Trotzdem besten Dank!


Anmelden zum Antworten