<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Fehler bei Messung der Textgröße (GetTabbedTextExtent)]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also, <strong>folgendes Szenario:</strong><br />
Ich habe eine mit <em>CreateFontIndirect</em> erstellte Schrift in einen Gerätekontext eingesetzt, um mir anschließend die Abmessungen eines bestimmten Textes ('Hallo') ausgeben zu lassen (natürlich nur testweise <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> ).</p>
<p><strong>Der Code dafür, sieht so aus:</strong></p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

#include &quot;CString.hpp&quot;

#include &quot;Resource.h&quot;

INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam)
{
	using NStr::CString;

	switch(uiMessage)
	{
		case WM_INITDIALOG:
			SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
			break;
		case WM_SIZE:
			InvalidateRect(hDlg, NULL, TRUE);
			break;
		case WM_PAINT: {
			PAINTSTRUCT ps;
			BeginPaint(hDlg, &amp;ps);

			LOGFONT lfFontData = { 0 };
			lstrcpyn(lfFontData.lfFaceName, TEXT(&quot;Arial&quot;), LF_FACESIZE);
			HFONT hfPrev = static_cast&lt;HFONT&gt;(SelectObject(ps.hdc, CreateFontIndirect(&amp;lfFontData)));

			const TCHAR szOut[] = TEXT(&quot;Hallo&quot;);

			TextOut(ps.hdc, 100, 70, szOut, lstrlen(szOut));

			/* ------------------------------------ */
			TextOut(ps.hdc, 0, 0,
				(CString(TEXT(&quot;Breite: &quot;)) + 
				CString(static_cast&lt;long&gt;(LOWORD(GetTabbedTextExtent(ps.hdc, szOut,
							lstrlen(szOut), 0, NULL))))).GetString(),
				(CString(TEXT(&quot;Breite: &quot;)) + 
				CString(static_cast&lt;long&gt;(LOWORD(GetTabbedTextExtent(ps.hdc, szOut,
							lstrlen(szOut), 0, NULL))))).GetLength());
			TextOut(ps.hdc, 0, 30,
				(CString(TEXT(&quot;Höhe: &quot;)) + 
				CString(static_cast&lt;long&gt;(HIWORD(GetTabbedTextExtent(ps.hdc, szOut,
							lstrlen(szOut), 0, NULL))))).GetString(),
				(CString(TEXT(&quot;Höhe: &quot;)) + 
				CString(static_cast&lt;long&gt;(HIWORD(GetTabbedTextExtent(ps.hdc, szOut,
							lstrlen(szOut), 0, NULL))))).GetLength());
			/* ------------------------------------ */

			DeleteObject(SelectObject(ps.hdc, hfPrev));
			EndPaint(hDlg, &amp;ps);
			} break;
		case WM_CLOSE:
		case WM_DESTROY:
			EndDialog(hDlg, 0);
			break;
		default:
			return (FALSE);
	}
	return (TRUE);
}
</code></pre>
<p><strong>Vorweg noch ein paar Anmerkungen zum Code:</strong><br />
Die Klasse <em>CString</em>, ist eine von mir geschriebene String-Klasse und ähnelt stark der Klasse <em>std::string/std::wstring</em>, hier wird sie nur verwendet, um eine Zahl in einen String zu verwandeln, da der Konstruktor dieser Klasse für den Datentyp <em>long</em> überladen ist (siehe <em>static_cast</em> im Code). Ich weiß, es gibt zahlreiche andere Möglichkeiten das zu konvertieren, aber das lag in diesem Fall am nächsten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> . <em>GetString()</em> arbeitet wie <em>c_str()</em> und <em>GetLength()</em> wie <em>length()</em> - wär häts gedacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> . Vllt gibt es hier und da Möglichkeiten die Performance noch zu verbessern, aber das ist nicht wichtig.</p>
<p><strong>So, nun zum Problem:</strong><br />
Die ausgegebenen Werte stimmen in keinster Weise mit den tatsächlichen Abmessungen der Schrift überein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> . Als Höhe ermittelt die Funktion 18, überprüft man das jedoch in 'MS-Paint', so kommt man nur auf 12. Ich hab das ganze auch mal mit der Funktion <em>GetTextExtentPoint32</em> probiert, diese liefert aber das selbe Ergebnis (da ich aber später auch Tabulatoren brauche, muss es eben am Ende <em>GetTabbedTextExtent</em> sein).</p>
<p>Hier auch nochmal ein Screenshot, den ich ein bisschen bearbeitet habe, damit die Sache deutlicher wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://img136.imageshack.us/my.php?image=screenshotdlgschriftmesiq8.png" rel="nofollow">http://img136.imageshack.us/my.php?image=screenshotdlgschriftmesiq8.png</a> .</p>
<p>Glaube ja, es ist was triviales, aber ich sitze daran nun schon länger - habt ihr ne Idee ?</p>
<p>Schonmal vielen Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> !</p>
<p>PS: Die mit Paint ausgelesene Breite, ist in Ansätzen noch nachvollziehbar und lässt sich vllt auf den Abstand der Buchstaben zueinander, also das <em>character-kerning</em>, zurückführen, aber zu der Höhe fällt mir nichts mehr ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179528/fehler-bei-messung-der-textgröße-gettabbedtextextent</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 13:32:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179528.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Apr 2007 00:18:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehler bei Messung der Textgröße (GetTabbedTextExtent) on Mon, 23 Apr 2007 00:18:00 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also, <strong>folgendes Szenario:</strong><br />
Ich habe eine mit <em>CreateFontIndirect</em> erstellte Schrift in einen Gerätekontext eingesetzt, um mir anschließend die Abmessungen eines bestimmten Textes ('Hallo') ausgeben zu lassen (natürlich nur testweise <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> ).</p>
<p><strong>Der Code dafür, sieht so aus:</strong></p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

#include &quot;CString.hpp&quot;

#include &quot;Resource.h&quot;

INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam)
{
	using NStr::CString;

	switch(uiMessage)
	{
		case WM_INITDIALOG:
			SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
			break;
		case WM_SIZE:
			InvalidateRect(hDlg, NULL, TRUE);
			break;
		case WM_PAINT: {
			PAINTSTRUCT ps;
			BeginPaint(hDlg, &amp;ps);

			LOGFONT lfFontData = { 0 };
			lstrcpyn(lfFontData.lfFaceName, TEXT(&quot;Arial&quot;), LF_FACESIZE);
			HFONT hfPrev = static_cast&lt;HFONT&gt;(SelectObject(ps.hdc, CreateFontIndirect(&amp;lfFontData)));

			const TCHAR szOut[] = TEXT(&quot;Hallo&quot;);

			TextOut(ps.hdc, 100, 70, szOut, lstrlen(szOut));

			/* ------------------------------------ */
			TextOut(ps.hdc, 0, 0,
				(CString(TEXT(&quot;Breite: &quot;)) + 
				CString(static_cast&lt;long&gt;(LOWORD(GetTabbedTextExtent(ps.hdc, szOut,
							lstrlen(szOut), 0, NULL))))).GetString(),
				(CString(TEXT(&quot;Breite: &quot;)) + 
				CString(static_cast&lt;long&gt;(LOWORD(GetTabbedTextExtent(ps.hdc, szOut,
							lstrlen(szOut), 0, NULL))))).GetLength());
			TextOut(ps.hdc, 0, 30,
				(CString(TEXT(&quot;Höhe: &quot;)) + 
				CString(static_cast&lt;long&gt;(HIWORD(GetTabbedTextExtent(ps.hdc, szOut,
							lstrlen(szOut), 0, NULL))))).GetString(),
				(CString(TEXT(&quot;Höhe: &quot;)) + 
				CString(static_cast&lt;long&gt;(HIWORD(GetTabbedTextExtent(ps.hdc, szOut,
							lstrlen(szOut), 0, NULL))))).GetLength());
			/* ------------------------------------ */

			DeleteObject(SelectObject(ps.hdc, hfPrev));
			EndPaint(hDlg, &amp;ps);
			} break;
		case WM_CLOSE:
		case WM_DESTROY:
			EndDialog(hDlg, 0);
			break;
		default:
			return (FALSE);
	}
	return (TRUE);
}
</code></pre>
<p><strong>Vorweg noch ein paar Anmerkungen zum Code:</strong><br />
Die Klasse <em>CString</em>, ist eine von mir geschriebene String-Klasse und ähnelt stark der Klasse <em>std::string/std::wstring</em>, hier wird sie nur verwendet, um eine Zahl in einen String zu verwandeln, da der Konstruktor dieser Klasse für den Datentyp <em>long</em> überladen ist (siehe <em>static_cast</em> im Code). Ich weiß, es gibt zahlreiche andere Möglichkeiten das zu konvertieren, aber das lag in diesem Fall am nächsten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> . <em>GetString()</em> arbeitet wie <em>c_str()</em> und <em>GetLength()</em> wie <em>length()</em> - wär häts gedacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> . Vllt gibt es hier und da Möglichkeiten die Performance noch zu verbessern, aber das ist nicht wichtig.</p>
<p><strong>So, nun zum Problem:</strong><br />
Die ausgegebenen Werte stimmen in keinster Weise mit den tatsächlichen Abmessungen der Schrift überein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> . Als Höhe ermittelt die Funktion 18, überprüft man das jedoch in 'MS-Paint', so kommt man nur auf 12. Ich hab das ganze auch mal mit der Funktion <em>GetTextExtentPoint32</em> probiert, diese liefert aber das selbe Ergebnis (da ich aber später auch Tabulatoren brauche, muss es eben am Ende <em>GetTabbedTextExtent</em> sein).</p>
<p>Hier auch nochmal ein Screenshot, den ich ein bisschen bearbeitet habe, damit die Sache deutlicher wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://img136.imageshack.us/my.php?image=screenshotdlgschriftmesiq8.png" rel="nofollow">http://img136.imageshack.us/my.php?image=screenshotdlgschriftmesiq8.png</a> .</p>
<p>Glaube ja, es ist was triviales, aber ich sitze daran nun schon länger - habt ihr ne Idee ?</p>
<p>Schonmal vielen Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> !</p>
<p>PS: Die mit Paint ausgelesene Breite, ist in Ansätzen noch nachvollziehbar und lässt sich vllt auf den Abstand der Buchstaben zueinander, also das <em>character-kerning</em>, zurückführen, aber zu der Höhe fällt mir nichts mehr ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271432</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Mon, 23 Apr 2007 00:18:00 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Messung der Textgröße (GetTabbedTextExtent) on Mon, 23 Apr 2007 11:56:56 GMT]]></title><description><![CDATA[<p>Nimm statt &quot;Hallo&quot; lieber &quot;gM&quot; zum ausmessen :<br />
<a href="http://msdn2.microsoft.com/en-us/library/ms533936.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms533936.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271684</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 23 Apr 2007 11:56:56 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Messung der Textgröße (GetTabbedTextExtent) on Mon, 23 Apr 2007 13:30:40 GMT]]></title><description><![CDATA[<p>Man muss berücksichtigen, dass hier auchnoch external ladings zur Anwednung kommen. Ich nehme sicherheithalber am liebsten g oder y und einen der großen Umlaute ÄÖÜ.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271763</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 23 Apr 2007 13:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Messung der Textgröße (GetTabbedTextExtent) on Mon, 23 Apr 2007 14:21:24 GMT]]></title><description><![CDATA[<p>Jupp, danke erstmal!<br />
Also 'gM' hat nichts gebracht. Da kam das gleiche raus. Nach ein bisschen probieren hab ich nun heraus bekommen, dass die 'tiefsten' Buchstaben q, y, g, ... sind (wie Martin schon geschrieben hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> ), der 'höchste' ist das Ó . Aber irgendwie lößt das mein Problem nur teilweise. Ich wollte eigentlich die tatsächliche Höhe eines ganz bestimmten Strings ermitteln. Wenn dort eben derartige Zeichen nicht vorhanden sind (wie eben in 'Hallo' oder 'pM' kein Ó vorhanden ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ), ist der String ja auch (in diesem Fall) nicht so hoch. Gibts da Möglichkeiten das zu berechnen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271796</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Mon, 23 Apr 2007 14:21:24 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Messung der Textgröße (GetTabbedTextExtent) on Wed, 25 Apr 2007 19:03:52 GMT]]></title><description><![CDATA[<p>*push* - Geht das überhaupt (Oder besser: Ist überhaupt klar, was ich meine <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ) ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273521</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Wed, 25 Apr 2007 19:03:52 GMT</pubDate></item></channel></rss>