Absatz in Unicode? Problem :(
-
Hi,
ich habe einen string vom typ wchar_t indem ich einen kleinen aber feinen text habe. in diesem text möchte ich gerne auch absätze drinhaben also ein \n.
Beim anzeigen kam statt des absatzes ein komischer kasten raus. dann habe ich gelesen das es nicht mehr \n ist sondern \r\n, doch da das selbe ergebnis: kästchen und kein absatz

ich zeichne diesen testtext per GDI funktion DrawText auf eine DirectDraw7 surface.
wie kann ich einen richtigen absatz hinbekommen?
schöne grüße, unicodeuser
-
Also bei mir klappt das mit \r\n einwandfrei

Evtl. hast du es irgendwie falsch in deinen Code eingebaut?!
-
kann sein, ich poste einfach mal den code zum erstellen und darstellen
void font::load (const std::wstring& name, unsigned long height, unsigned long width, unsigned long attributes) { HDC* device_context; directdraw::getInstance().backbuffer->GetDC(&device_context); SaveDC (device_context); // Ausrichtungen SetGraphicsMode (device_context, GM_ADVANCED); ModifyWorldTransform (device_context, NULL, MWT_IDENTITY); SetViewportOrgEx (device_context, 0, 0, NULL); SetWindowOrgEx (device_context, 0, 0, NULL); const float x = static_cast<float>(GetDeviceCaps (device_context, LOGPIXELSX)); const float y = static_cast<float>(GetDeviceCaps (device_context, LOGPIXELSY)); POINT pt = {static_cast<long>(width * x / 72), static_cast<long>(height * y / 72)}; DPtoLP (device_context, &pt, 1); LOGFONTW lf; ZeroMemory (&lf, sizeof(lf)); int weight = 0; if (attributes & bold) weight = 700; if (attributes & extrabold) weight = 900; lf.lfHeight = -:MulDiv(height, GetDeviceCaps(device_context, LOGPIXELSY), 72); lf.lfWeight = weight; //attributes & bold ? 700 : 0; lf.lfItalic = attributes & italic ? 1 : 0; lf.lfUnderline = attributes & underline ? 1 : 0; lf.lfStrikeOut = attributes & strikeout ? 1 : 0; lf.lfQuality = ANTIALIASED_QUALITY; lf.lfCharSet = DEFAULT_CHARSET; wcscpy (lf.lfFaceName, name.c_str()); font_ = CreateFontIndirectW (&lf); // ggf. Schriftbreite verändern if (width != 0) { // Schriftart selektieren font_ = static_cast<HFONT>(SelectObject(device_context, font_)); TEXTMETRIC tm; GetTextMetrics (device_context, &tm); DeleteObject (::SelectObject(device_context, font_)); lf.lfWidth = static_cast<long>(tm.tmAveCharWidth*abs(pt.x)/abs(pt.y)+0.5); font_ = CreateFontIndirectW (&lf); } RestoreDC (device_context, -1); directdraw::getInstance().backbuffer->ReleaseDC (device_context); } void font::draw(const std::wstring& text, long x, long y, long color, long w, long h) { HDC device_context; directdraw::getInstance().backbuffer->GetDC(&device_context); SelectObject (device_context, font_); SetTextColor (device_context, color); SetBkMode (device_context, TRANSPARENT); if (w > 0 && h > 0) { RECT rc = { x, y, x+w, y+h }; DrawTextW (device_context, text.c_str(), static_cast<int>(text.size()), &rc, DT_WORDBREAK); } else { TextOutW (device_context, x, y, text.c_str(), static_cast<int>(text.size())); } directdraw::getInstance().backbuffer->ReleaseDC (device_context); }ich hoffe damit kannst du was anfangen.
Schöne grüße, unicodeuser
-
*push* flenders hast du keine lösung meines problems? *schnief*

-
Für diese Frechheit sollte der Thread geschlossen werden.
-
Leider zeigst du nicht, wie du font::draw aufrufst. Bist du sicher, dass du überhaupt in den Zweig mit DrawText reinkommst?
-
unicodeuser schrieb:
*push* flenders hast du keine lösung meines problems? *schnief*

Naja, ein bisschen Geduld musst du schon mitbringen - ich surfe auch nicht den ganzen Tag nur im Forum herum

unpush schrieb:
Für diese Frechheit sollte der Thread geschlossen werden.
Also ein Grund einen Thread zu schließen ist das nun wirklich noch nicht - auch wenn es etwas unfreundlich ist

-
flenders schrieb:
Naja, ein bisschen Geduld musst du schon mitbringen - ich surfe auch nicht den ganzen Tag nur im Forum herum

*erschüttert*
-
@flenders
sorry wollte nicht unhöflich sein
dachte nur du wüsstest evtl. schon wo das problem liegt. sorry@MFK
ich rufe so auffont_objekt.draw (L"Hallo\r\n dies ist\n ein Test für Absätze!", 10, 10, 0xFFFFFFFF); bzw. font_objekt.draw (L"Hallo\r\n dies ist\n ein Test für Absätze!", 10, 10, 0xFFFFFFFF, 100, 50);In beiden Fällen wird Text ausgegeben nur halt da wo der absatz sein sollte ist keiner sondern nur 1-2 klötzchen

-
Im ersten Fall wird dann ja TextOutW aufgerufen, aber im zweiten Fall müsste es eingentlich klappen
Hast du mal mit dem Debugger (oder mit einer MessageBox) geschaut, ob wirklich DrawTextW aufgerufen wird?Denn sowas funktioniert bei mir ohne Probleme:
hdc = BeginPaint (hwnd, &ps); RECT rc = { 10, 10, 110, 60 }; LPCWSTR str = L"Hallo\r\n dies ist\n ein Test für Absätze!"; DrawTextW(hdc, str, lstrlenW(str), &rc, DT_WORDBREAK); EndPaint (hwnd, &ps);
-
Scheiße das geht ja! DrawTextW war richtig, hatte nur den Darstellungsbereich zu klein *peinlich*
Wieso geht das bei TextOut denn nicht?
-
unicodeuser schrieb:
Wieso geht das bei TextOut denn nicht?
Weil TextOut soweit ich weiß nur alles in einer Zeile ausgeben kann und sich nicht um Steuerzeichen wie \r\n kümmert.
-
aso!
ergo muss ich überall die Abmessungen des Textclients angeben damit er in diesem Rechteck dann zeichnet? hmn ich glaube damit kann ich leben
