[gelöst] StandardDialog anpassen / verändern - "Ein-Verzeichnis-höher"-Button ausblenden



  • Hallo Gemeinschaft,

    wie der Threadname schon andeutet geht es mir darum, einen Standarddialog anzuzeigen der etwas modifiziert ist. Konkret handelt es sich momentan um den "Datei öffnen"-Dialog. Dieser soll weitesgehend wie gewohnt aussehen, jedoch keine Änderung des Pfades erlauben. Ich möchte den Standarddialog nutzen, damit der Anwender seine gewohnte Oberfläche beim Öffnen einer Datei angezeigt bekommt, ansonsten könnte ich mir ja auch einfach selbst ein Formular (arbeite mit Borland) basteln.
    Nun habe ich ordentlich MSDN gelesen und bin ich schon recht weit gekommen - ich kann alle Beschriftungen verändern und ich kann einige Controls ausblenden. So war es mir möglich die ComboBox zur Verzeichnisauswahl und das Label links davon auszublenden. Bsp:

    HWND hOpenDlg= GetParent(OpenDialog->Handle);
    PostMessage(hOpenDlg, CDM_HIDECONTROL, 0x0471, NULL); // blendet die Verzeichnis-Combobox aus
    

    Nun möchte ich noch die Schaltfläche zum Wechsel in ein höheres Verzeichnis ausblenden, habe aber nach intensiver Suche bisher nichts dazu gefunden.
    Habt ihr Hinweise für mich? 😕

    MfG

    Edit: [gelöst]-Tag in Threadtitel eingefügt 🙂



  • Ich brauche doch eigentlich nur die ID dieses Button / Icon f. "Eine-Ebene_höher"... dachte ich und habe mal versucht den Dialog vollständig zu leeren:

    HWND hOpenDlg= GetParent(OpenDialog->Handle);
    for(int i= 0x0000; i < 0xFFFF; ++i)                      //=> Alle möglichen Controls ausblenden
    	PostMessage(hOpenDlg, CDM_HIDECONTROL, i, NULL);
    

    Aber Pustekuchen 😞 , das Ergebnis sieht so aus:

    => Screenshot: (fast) leerer Standarddialog (Link zu *.jpg auf bilder-space de).

    Das führt mich zu der Vermutung dass es sich hier nicht einfach nur um Controls, sondern um etwas Anderes handelt... jemand einen Hinweis? Muss ich mir da noch ein "Unterhandle" von hOpenDlg holen?

    MfG

    Edit: mit "Unterhandle" meinte ich natürlich das Handle eines Child-Element vom Standarddialog 😉



  • Hallo,

    Spy++ anwerfen, erkennen, dass es sich um ein ToolbarWindow32 handelt, und entsprechende Nachrichten für das Aus/Einblenden von Toolbar-Buttons senden, siehe:

    http://msdn.microsoft.com/en-us/library/bb760443(VS.85).aspx

    MfG,

    Probe-Nutzer



  • Hallo Probe-Nutzer,

    vielen Dank erstmal für die hilfreiche Antwort! 🙂
    Spy++ und WinAPI sind für mich ziemliches Neuland - ich habe lediglich mal das Schliessen-Kreuz eines Form mittels WinAPI deaktiviert, von Spy++ habe ich gestern das erste Mal gelesen (wobei mir nicht klar war, dass mir das in meinem konkreten Fall weiterhelfen könnte!) ...

    Ich bin jetzt der Lösung schon ziemlich nahe (denke ich):

    HANDLE hToolBar= FindWindowEx(hOpenDlg, NULL, "ToolbarWindow32", NULL);
    if(hToolBar)
        SendMessage(hToolBar, TB_HIDEBUTTON, /* <Button-Id> */, (LPARAM)long(true));
    

    Nun habe ich zum Test in einer Schleife alle ID's von 0 bis 65535 durchgespielt (was mit PostMessage übrigens nicht funktioniert hat?) und es werden alle Buttons aus der Toolbar ausgeblendet...

    ... bis auf den "Eine-Ebene-Höher"-Button! 😮

    Wie komme ich jetzt an die korrekte ID dieses Button? Steht die in irgendeinem Std-/Common-Header? Oder kann ich die über irgendeine clevere Funktion herausbekommen?

    Vielen Dank nochmals!!! 👍

    MfG



  • Ich hab's geschafft 🙂

    Ich hab mir hier im WinAPI-FAQ mal Toolbar erstellen (+ Erstellen/Löschen von Buttons...) durchgelesen und gesehen, dass es eine Methode gibt bei der die Button-ID nicht gebraucht wird, sondern einfach die Button-Position (ab 0) angegeben wird. Zu meinem Glück ist das auch noch die Lösch-Methode:

    SendMessage(hToolBar, TB_DELETEBUTTON, /* <Position in Toolbar> */, NULL);
    

    So kann ich also einfach den Button herauslöschen 😃 Sehr lecker!

    Das Ergebnis sieht nun so aus:

    HANDLE hOpenDlg= GetParent(OpenDialog->Handle);
    PostMessage(hOpenDlg, CDM_HIDECONTROL, 0x0471, NULL);
    PostMessage(hOpenDlg, CDM_HIDECONTROL, 0x0443, NULL);
    HANDLE hToolBar= FindWindowEx(hOpenDlg, NULL, "ToolbarWindow32", NULL);
    if(hToolBar){
    	SendMessage(hToolBar, TB_DELETEBUTTON, 0, NULL);
    	SendMessage(hToolBar, TB_DELETEBUTTON, 0, NULL);
    	SendMessage(hToolBar, TB_DELETEBUTTON, 0, NULL);
    }
    

    "Einen Schritt zurück", "Eine Ebene höher" und "Neuen Ordner erstellen" sind damit nun auch passé => Screenshot: OpenDialog ohne Ordnerauswahl / -Manipulation 🙂 (Link zu *.jpg auf bilder-space de).

    Es wäre zwar schön, wenn das Menü "Ansicht" ganz rechts im Dialog stehen würde, aber das Problem ansich ist erstmal gelöst!

    MfG

    Edit: Rechtschreibung 😉



  • Übrigens: Falls jemand die Frage nach den ID's der Toolbar-Buttons noch beantworten kann, würde ich mich über diese Information freuen! 😉



  • Noch eine kurze Frage (gehört noch zu "StandardDialog anpassen / verändern" 😉 ):

    Ich möchte noch die Liste zuletzt geöffneter Dateien leeren, weil der Anwender sonst ja doch wieder (indirekt) das Verzeichnis wechseln kann. Beim nächsten Öffnen des Dialog (nach Öffnen einer Datei aus der Liste zuletzt geöffneter Dateien) ist nämlich dann der Ordner der zuletzt mit dem Dialog geöffneten Datei geöffnet... InitialDir ist zwar angegeben, aber das scheint dem Dialog egal zu sein...
    Das ist mein Versuch, die Liste zu leeren:

    HANDLE hFileCmb= GetDlgItem(hOpenDlg, 0x047C);
    SendMessage(hFileCmb, CB_RESETCONTENT, NULL, NULL);
    

    Leider wird die Liste nicht geleert. Ist OnShow() vielleicht nicht der richtige Zeitpunkt?

    MfG


Anmelden zum Antworten