PathSetDlgItemPath() und In-place Tooltips



  • Hi Community,

    ich verwende einige Dialogboxen.
    In diesen befinden sich (z.T. mehrere) Static-Controls, in der ich verschiede Pfadnamen darstellen kann.
    Z.B. den kompletten Pfad für den Speicherort einer *ini-Datei.

    Da der Text dieses Pfadnamens sehr lang sein kann, verwende ich hierfür PathSetDlgItemPath().
    Bei Bedarf kürzt diese Funktion den Text im Static-Control ab, funktioniert wunderbar.

    Um trotzdem den vollständigen Pfadtext lesen zu können verwende ich In-place Tooltips.
    Natürlich darf der Tooltip nur dann erscheinen, wenn der Pfadtext durch PathSetDlgItemPath() tatsächlich gekürzt wurde. Leider gibt diese Funktion keinen Rückgabewert zurück!

    Diese Kürzung ermittle ich mittels GetDlgItemText(), indem ich per strlen() (bzw. _tcslen() bei TCHAR) die Textlängen zwischen dem Original-Pfadtext und dem im Dialog dargestellten Text vergleiche.

    Ist das so zuverlässig genug oder soll ich besser einen echten Stringvergleich (Zeichen für Zeichen) verwenden?
    Oder gibt es vielleicht eine andere (elegantere) Möglichkeit, die ich übersehen habe?

    Martin



  • wie wird denn der pfad nach der kürzung dargestellt?

    ich selbst hab PathSetDlgItemPath noch nicht ausprobiert, aber ich hab das bei anderen programmen schon gesehen(das entresultat). entweder waren die nahmen der ordner weg und es folgten mehrer backslash's aufeinander, bzw. die gelöschen pfadangaben waren durch punkte ... ersetzt.

    ist das bei dir genau so?
    dann müßtest du nur ne abfrage starten ob punkte bzw. ein doppelter backslash im string vorhanden ist!

    [NEW EDIT]
    bzw seh ich gerade, das PathSetDlgItemPath ja einen boolischen wert zurückgibt, wenn es den pfad gekürzt hat. Klemm den wert hat mittels

    BOOL bShortPath = PathSetDlgItemPath(...);
    SetWindowLong(HWND,GWL_USERDATA,bShortPath);
    

    an das jeweilige Static Fenster und somit könntest du mit

    if((BOOL)GetWindowLong(HWND,GWL_USERDATA))
    

    ganz problemlos abfragen ob der pfad im Fenster gekürzt ist 😉



  • Was spricht denn dagegen, generell den Originalpfad im Tooltip anzuzeigen?



  • Richtig, bei einem überlangen Pfad wird z.B. aus

    vorher:   C:\Dokumente und Einstellungen\Administrator\sample.ini
    nachher:  C:\Dokumente...\sample.ini
    

    eben soweit gekürzt, wie es in das Static-Control von der Anzahl der Pixel her gerade noch reinpaßt.

    @rT!f@Ct schrieb:

    bzw seh ich gerade, das PathSetDlgItemPath ja einen boolischen wert zurückgibt, wenn es den pfad gekürzt hat.

    Wo hast Du das gesehen? Quellennachweis?

    Ich habe nur diese Information in der MSDN gefunden:
    PathSetDlgItemPath() http://msdn.microsoft.com/en-us/library/bb773752(VS.85).aspx
    Dort steht, daß die Funktion gar nichts zurückgibt, "void" halt.

    Martin



  • sri schrieb:

    Was spricht denn dagegen, generell den Originalpfad im Tooltip anzuzeigen?

    Die m.E. unnötige Verwirrung der Nutzer durch aufpoppende Tooltips,
    die hier keine Mehrwertinformation liefern würden, wenn der Pfad bereits in voller Länge im Dialog lesbar ist.



  • hmmm 😕

    @rT!f@Ct schrieb:

    bzw seh ich gerade, das PathSetDlgItemPath ja einen boolischen wert zurückgibt, wenn es den pfad gekürzt hat.

    Mmacher schrieb:

    Wo hast Du das gesehen? Quellennachweis?

    jetzt bin ich echt buff.
    ähm bei mir in der MSDN von VS 6, die nutz ich meistens weils schneller geht als im inet zu suchen.

    aber dann machs halt so,

    prüfe ob der org. Pfad länger ist als der im Static Fenster. wenn ja dann machst du halt das Spiel Mit Set/GetWindowLong



  • Mmacher schrieb:

    sri schrieb:

    Was spricht denn dagegen, generell den Originalpfad im Tooltip anzuzeigen?

    Die m.E. unnötige Verwirrung der Nutzer durch aufpoppende Tooltips,
    die hier keine Mehrwertinformation liefern würden, wenn der Pfad bereits in voller Länge im Dialog lesbar ist.

    Na dann mach doch einen kompletten Stringvergleich und zeige das Tooltip bei Ungleichheit an. Das ist schließlich keine performance-kritische Funktion. Zudem werden die Tooltips auch nicht 100x pro Sekunde aufgerufen.



  • Ja, der komplette Stringvergleich ist nötig.
    Danke für Eure Hilfe.

    Martin

    P.S.: Übrigens, das Absuchen des gekürzten Strings nach der Zeichenfolge "..." ist unzuverlässig, da auch ein normaler Dateiname selbst eine solche Zeichenfolge "..." enthalten kann (was aber eher unüblich ist).

    P.P.S.: Genauso ist es unzuverlässig, nur auf Länge des Strings hin zu überprüfen.
    Denn z.B. aus "C:\Dokumente und Einstellungen\E\Meine Datei.txt" wird "C:\Dokumente und Einstellungen...Meine Datei.txt". D.h. identische Textlängen (aber kürzerer Platzbedarf durch die platzsparenden Punkte!)


  • Mod

    Mmacher schrieb:

    Diese Kürzung ermittle ich mittels GetDlgItemText(), indem ich per strlen() (bzw. _tcslen() bei TCHAR) die Textlängen zwischen dem Original-Pfadtext und dem im Dialog dargestellten Text vergleiche.

    Ist das so zuverlässig genug oder soll ich besser einen echten Stringvergleich (Zeichen für Zeichen) verwenden?

    Du musst den String vergleichen! Ein Längenvergleich ist ungenügend.
    Grund: Nehmen wir mal ein Dein Pfad mag in einem Teil Großbuchstaben wie WWW enthalten. Es kann sein dass diese drei Zeichen ersetzt durch ... bereits kürzer sind.
    Die Folge: Die Stringlänge wäre gleich.



  • Gell, Martin,
    das hab ich schon kurz vor Deinem Posting geschrieben 🕶

    Trotzdem Danke,
    lieber doppelt gemoppelt als keine Infos.

    Martin


  • Mod

    Mmacher schrieb:

    das hab ich schon kurz vor Deinem Posting geschrieben 🕶

    Sorry! Wie so oft habe ich aufgrund von Eile zu hastig gelesen und damit überlesen.


Log in to reply