Absatz in Unicode? Problem :(



  • 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 auf

    font_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 😉


Anmelden zum Antworten