[gelöst] Textlänge in Pixel ermitteln

  • Hallo,
    ich versuche die Länge eines Texte in Pixel zu ermitteln.
    Dabei kann ich aber nicht einfach die Zeichenzahl verwenden, da der Text als proportionale Schrift angezeigt werden soll.
    Der Text soll z.B. als SplashText angezeigt werden, wobei sich die Länge der Box automatisch an die Textlänge anpasst.

    Dabei bin ich u.a. auf die Funktion "_GUICtrlListView_GetStringWidth($hListView, "Text")" gestoßen.
    Diese Funktion gibt mir zwar die Pixelzahl zurück, aber sie braucht auch ein Handle zu einer ListBox, die ich aber nicht habe.
    Ich vermute diese Handle wird von der Funktion benötigt, um die Schriftart die Schriftgröße usw. zu ermitteln.

    Ich brauche also eine Funktion, die aus einem Text, der als String vorliegt, die Pixelzahl zurückgibt, die dieser String benötigt und die am besten alle zum ermitteln erforderlichen Werte selber aus z.B. der Registry (ich vermute mal, da steht alles erforderliche drin) auslesen kann.
    Achja, die Funktion soll mit Windows 10 funktionieren.


    MfG:
    BigRox

    • Offizieller Beitrag

    Dafür hatte ich mal folgende Funktion erstellt:

    • Offizieller Beitrag

    In der Hilfe zu _WinAPI_GetTextExtentPoint32 findet sich eine Funktion GetStringDimensions, mit der man die Stringlänge gut berechnen kann.
    Und das ohne eine Hilfs-Gui erstellen zu müssen oder GDI+ zu bemühen.
    Ich habe das Beispiel mal auf ein Label erweitert:

    • Offizieller Beitrag

    Ja, Oscar - ich glaube über die Funktion hatten wir schon mal gesprochen. Sie ermöglicht aber nicht, die Textlänge vor Erstellen des Ctrl zu ermitteln. Ist ja klar - irgendwo muß der Text ja mit seiner Formatierung abgemessen werden.
    Wenn du verschiedene Texte in einem Ctrl anzeigen möchtest, brauchst du die max. Länge um folgende Ctrl genau positionieren zu können. Also eher eine Funktion, die während der Skriptentwicklung Anwendung findet, weniger im fertigen Skript.

  • Hallo BugFix und Oscar,
    :thumbup: DANKE für eure Antworten :thumbup:

    Ich versuch es mal mit der Funktion von BugFix.
    Die Funktion funktioniert ganz gut.

    Nur eins ist mir dabei nicht so ganz klar.
    Wenn GDI+ schon vorm Aufruf der Funktion mit _GDIPlus_Startup() gestartet wurde, beendet dies Funktion dann einfach GDI+, weil da ja am Ende _GDIPlus_ShutDown() aufgerufen wird, oder läuft GDI+ auch nach dieser Funktion dann noch weiter, da ja dann auch noch einige GDI+-Objekte existieren ?

    MfG:
    BigRox

    • Offizieller Beitrag

    Wenn GDI+ schon vorm Aufruf der Funktion mit _GDIPlus_Startup() gestartet wurde, beendet dies Funktion dann einfach GDI+, weil da ja am Ende _GDIPlus_ShutDown() aufgerufen wird, oder läuft GDI+ auch nach dieser Funktion dann noch weiter, da ja dann auch noch einige GDI+-Objekte existieren ?

    Der Mechanismus ist folgender:
    Über einen UDF-internen Zähler wird festgestellt, wie oft StartUp bzw. ShutDown aufgerufen wird. Dabei wird der Zähler rauf/runter gesetzt. Nur wenn er bei 0 ist, wird beim ShutDown auch die Dll geschlossen.