Textdarstellung mit Gdi+



  • Gegrüßet seid ihr!
    Da das Ausgabefenster meines Programmes einmal gepimpt gehörte und ich mal wissen wollte wie man so etwas umsetzen könnte, habe ich mich daran gemacht, einmal selber ein Edit-Control zusammenzubasteln.
    Im Word-Wrap-Modus iteriere ich nun sozusagen über "Tokens", was nun sowohl Wörter sind, sowie die Zwischenräume zwischen ihnen, und stelle sie Wortweise dar, wobei ich die Koordinaten vor der Darstellung natürlich entsprechend anpasse. Dabei stoße ich allerdings auf das Problem, dass die Größe eines Leerzeichens inmitten eines Textes anders bewertet wird, als wenn man die größe des alleinigen Leerzeichens bestimmt. Meine Darstellung sieht also entsprechend etwas langgezogen aus, weil die Zwischenräume zwischen den Wörtern zu groß sind.
    Wisst ihr einen Weg, wie ich die Größe der Zwischenräume vernünftig bewerten könnte?

    Noch eine andere Sache... Hat die "C-Api" von Gdiplus eventuell Funktionen, die darauf spezialisiert sind, dass man fortlaufend Text ausgibt, dass sie sich nicht jedes mal "neu initialisieren" müssen? Wobei ich im Moment eigentlich keine Performance-Probleme habe, aber ich hab auch nix dagegen, etwas effizienter zu werden in diesem Zusammenhang.

    Viele Grüße,
    Michael



  • So, ich habe mich weiter in die Thematik eingelesen und gesehen, dass man aus der herkömmlichen GDI alle Werte, die man zum Layout braucht, herausbekommt. Allerdings habe ich auch gelesen, dass Gdi+ Fonts anders rendert als die Gdi selber. Kann ich denn dann überhaupt die Maße von den Gdi-Funktionen hernehmen und mit Gdi+ zeichnen, oder sollte ich dann komplett bei der Gdi bleiben, für korrekte Darstellung? Gdi+ scheint ja in diesem Zusammenhang kein bloßer Wrapper zu sein.

    Viele Grüße,
    Michael


  • Mod

    Gdi+ rendert anders aber die Metrik bleibt IMHO erhalten.

    Ansonsten: Warum verwendest Du denn nicht MeasureCharacterRanges?
    http://msdn.microsoft.com/en-us/library/ms535796(VS.85).aspx



  • Hey Du,
    auf Dich kann man sich ja irgendwie verlassen. 😃 Also ich glaub, ich verwende die Funktion nicht, weil sie mir irgendwie nicht wie für mein Problem geschaffen vorkommt. Also ich glaub, wenn ich das alles "richtig" (tm) implementieren wollte, müsste ich schätzungsweise sowieso UniScribe verwenden. Allerdings ist das ja auf dem absteigenden Ast (...DirectWrite), also beschränke ich mich zu Studienzwecken auf die normalen Gdi-Funktionen und gehe davon aus, dass ich Kunden im nahen Osten nicht bedienen werde :D.
    Wie hattest Du dir denn vorgestellt, dass ich die Funktion verwende? Mein Problem ist ja, dass irgendwo in den Zeilen der Font oder dessen Größe wechseln können und die Funktionen von Gdi+ bieten zwar ein Layout um Text in einem Rechteck zu verteilen, aber ich kann denen in der ersten Zeile ja keinen "Start-X-Wert" vorgeben (mal außen vor gelassen, dass ich an der Stelle einen Tabstop einfügen könnte und dann mit einem Tab starten könnte, aber das ist alles so hackig).
    Soweit funktioniert das ja alles gut im Moment und ich würde schätzen, dass in den Kerningpairs des Fonts auch Kombinationen von Glyphe-X + Leerzeichen und Leerzeichen + Glyphe-Y vorhanden sind, damit ich fix die Leerzeichen-Breite anpassen kann. Außerdem kann ich mit all den Daten dann auch einigermaßen nachvollziehbar und intuitiv Hit-Testing durchführen (Was ich wohl im Prinzip auch mit der von dir genannten Funktion implementieren könnte, indem ich für jeden einzelnen Buchstaben eine Range verwende und dann die Regionen teste, aber....).



  • Die Metrik ändert sich, da GDI+ "device independent" rendert, und GDI "device dependent".

    Guckst du:
    http://support.microsoft.com/kb/307208



  • Danke hustbaer!
    Damit fällt Gdi+ in diesem Fall leider aus für mich 😞 Was soll's^^ Schade, dass Gdi+ in diesem Fall nicht die "Mächtigkeit" (In Form der Werte, die man bekommt, nicht in der Qualität der Darstellung) von der althergebrachten GDI besitzt. Naja, für normale Anwendungsfälle taugt sie ja.


Anmelden zum Antworten