Falsche Ergebnisse bei GetTextExtentPoint32



  • Hi Leutz
    Ich habe eine Funktion, um Die Höhe und Breite eines Textes in einer bestimmten Font zurück zu liefern. zuerst durchsuche ich den an die funktion übergebenen string auf "\n"s, und extrahiere die davon umgebenen strings (ich spalte den text also in seine einzelnen zeilen). für jede dieser zeilen rufe ich nun GetTextExtentPoint32 auf, die höhen der Zeilen addiere ich und als breite nehme ich die breite der längsten/breitesten zeile. diese 2 werte packe ich nun in eine SIZE struktur und gebe diese zurück. per directx lasse ich nun den text ausgeben (für das problem uninteressant, es sei hier nur mal gesagt). lasse ich die anwendung nun längere zeit laufen (5 - 10 min), so liefert GetTextExtentPoint32 aufeinmal völlig falsche ergebnisse zurück. frage: weß jemand, woran das liegt, oder hatte vielleicht schon mal jemand dieses prob (bevor blöde sprüche kommen: ja, ich habe die suche benutzt, und google auch!)? wie kann ich es lösen/umgehen?
    danke schonmal im voraus



  • Babbo schrieb:

    weß jemand, woran das liegt

    An deinem Code. Poste ihn und man kann dir den Fehler zeigen.



  • Müsste am DC liegen das du der Funktion übergibst. Arbeitest du mit Memory DC's (also Backbuffern)?



  • Hm, naja, ich arbeite nicht wirklich mit DCs. ich lasse mir von meinem fenster in der funktion einfach einen dc "geben" (GetDC), setze dann die font (SelectObject), führe GetTextExtentPoint32 aus, setze die alte font wieder und "lösche" den dc (ReleaseDC). hoffe, diese beschreibung hilft, sorry, hab von der WinAPI nicht so de ahnung, wie gesagt, ich code eigentlich mit DirectX.
    @ D@niel $chumann : Der code kommt noch, bin nur grad am falschen rechner.



  • Erstellst evtl. bei jedem Durchlauf neu den neuen Font (ohne ihn freizugeben)?



  • Ich habe eine LOGFONT struktur und rufe jedes mal CreateFont auf, ja, aber was meinst du mit freigeben?



  • DeleteObject



  • Babbo schrieb:

    aber was meinst du mit freigeben?

    MSDN schrieb:

    When you no longer need the font, call the DeleteObject function to delete it.

    Was ist "Falsch"?

    a) "size" ist in logical units, nicht unbedingt in pixeln
    b) die funktion berücksichtigt kein Escapement oder Rotation

    Ich hab mit DrawText(...,DT_CALCRECT) gute Erfahrungen gemacht, weiß aber nicht ob da Dir in deinem Fall nützt.



  • @ peterchen: zu a, ich weiß, aber zuerst passt es ja, wie im ersten posting gesagt, erst nach 5 - 10 minuten passiert das (dass Die funktion falsche werte ausspuckt).
    zu b, hab ich beides nicht "drin" in meinem geldaenen font.
    ach ja, braucht man für DrawText(...DT_CALCRECT) nicht mindestens einen Wert des Rects? ich möchte ja beide berechnen.
    zu dem delete object: probier ich mal.



  • Also, es klappt jetzt, ich musste tatsächlich nur die erstellte font löschen.
    danke an alle, hab aber noch ne frage:
    nochmal zu dem was peterchen gesagt hat, wegen escapement nd so. gibt es eine funktion, ide das selbe tut, wie GetTextExtentPoint32, aber eben auch escapement, rotation und all den kram berücksichtigt?



  • Soweit ich weiß nicht. Je mehr aber eine Funktion berücksichtigen muss, desto länger wird sie brauchen um zu einem Resultat zu kommen. Vorallem Berechnungen, die mit Text zusammenhängen kann es zu langen Kalkulationszeiten kommen. Wenn es nicht unbedingt notwendig ist, dann würde ich darauf verzichten...insbesondere weil es eine DirectX Anwendung ist. Da zählt die Performance sehr viel. Du brauchst nur in den Google Groups nach den Begriffen "DrawText" und "slow" suchen, dann kannst du dir ein Bild davon machen welche Schwierigkeiten damit auftreten...



  • Nun gut, du hast wohl recht. naja, danke nochmal an alle,
    ciao


Anmelden zum Antworten