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!!!
-
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!