Seite 1 von 2

CreateWindow und Explorer

Verfasst: 25.10.2014 17:37
von GronkhLP
Kann man den Windows Explorer als Control erstellen? Ich meine sowas mal damals irgendwo gesehen zu haben, aber ich kriegs leider nicht hin:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 800, 600, "InlineExplorer", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CreateWindowEx_(0, "Explorer", 0, #WS_CHILD | #WS_VISIBLE, 0, 0, 800, 600, WindowID(0), 0, 0, 0)
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Bei mir erscheint da nichts. Habe ich da was wichtiges vergessen? Oder gibt es kein "Explorer" als Controltyp? Oder heißt der anders? Einige von euch haben bestimmt schon "Warum nicht gleich ExplorerListGadget?!" geschrien :D , aber das will ich nicht, weil ich gerne die komplette Funktionspalette übernehmen möchte und nicht das Rad neu erfinden möchte. Funktionen, die ich meine, sind Rechtsklick zum Öffnen des Kontextmenüs, Doppelklick zum Ausführen und Drag 'n' Drop zum Verschieben von Dateien. All diese Funktionen müsste ich nachprogrammieren. Kann man den Explorer nicht einfach einbinden oder gibt es nur "ListView" bzw. ExplorerListGadget? Mit WebGadget ginge das zwar auch, aber meine Frage lautet, ob es mit CreateWindow / CreateWindowEx auch ginge? Kennt sich jemand aus und kann mir weiter helfen? Ich danke euch vielmals. :)

Re: CreateWindow und Explorer

Verfasst: 25.10.2014 18:18
von Kiffi
ist nicht einfach. Daran habe ich mir vor Jahren auch schon mal die Zähne ausgebissen:

http://www.purebasic.fr/german/viewtopi ... it=winduos

(die Downloadquellen funktionieren nicht mehr. Der Code, den ich hier habe, läuft auch nicht mehr auf meinem Win7)

Grüße ... Peter

Re: CreateWindow und Explorer

Verfasst: 25.10.2014 20:24
von RSBasic
@GronkhLP
Mit CreateWindow(Ex)_() kannst du soweit ich weiß nur eine einfache ListBox erstellen. Benutze einfach WebGadget(). ;)

Re: CreateWindow und Explorer

Verfasst: 25.10.2014 20:34
von GronkhLP
Okay danke Kiffi und RSBasic. :)

Warum ich eigentlich lieber CreateWindow als WebGadget bevorzugen möchte, liegt daran, dass ich vermute, dass man den WebBrowser als Control nicht so einfach mit WinAPI-Schnittstelle ansteuern bzw. verändern kann wie beim ListView. Ich kann nur mit SetGadgetText den lokalen Pfad ändern. Ich möchte aber auch gerne die aktuelle Icon-Ansicht ändern, weil bei mir, wahrscheinlich wegen Standard-Einstellung von Windows Explorer, die Detaillistenansicht angezeigt wird, die ich aber nicht haben möchte. :( Muss ich wohl akzeptieren. Trotzdem vielen Dank für eure Hilfe. :)

Re: CreateWindow und Explorer

Verfasst: 25.10.2014 20:45
von RSBasic
@GronkhLP
Auch beim WebGadget() hast du die Möglichkeit, auf die angezeigte ListBox zuzugreifen. Es ist nur drin verschachtelt und du musst nur mit Hilfe von FindWindowEx_() die Handle-Nummer des ListView-Controls ermitteln, die du genauso für die anderen WinAPI-Funktionen verwenden kannst.
Beispiel:

Code: Alles auswählen

EnableExplicit

Define Handle

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  WebGadget(1, 0, 0, WindowWidth(0), WindowHeight(0), "C:\")
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Select EventType()
              Case #PB_EventType_DownloadEnd
                Handle = FindWindowEx_(GadgetID(1), 0, "Shell Embedding", 0)
                Handle = FindWindowEx_(Handle, 0, "SHELLDLL_DefView", 0)
                Handle = FindWindowEx_(Handle, 0, "SysListView32", 0)
                
                SendMessage_(Handle, #LVM_SETVIEW, #LV_VIEW_ICON, 0)
                SetWindowLongPtr_(Handle,#GWL_STYLE,GetWindowLongPtr_(Handle,#GWL_STYLE) | #LVS_NOCOLUMNHEADER)
            EndSelect
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: CreateWindow und Explorer

Verfasst: 25.10.2014 21:00
von Kiffi
Argh! Jetzt wird mir auch klar, warum das WebGadget erwähnt wurde.

So einfach ist das? :shock:

Danke für den Tipp! :allright:

Grüße ... Peter

Re: CreateWindow und Explorer

Verfasst: 25.10.2014 21:04
von GronkhLP
Supi, danke für diesen Code! :)

Aber es sieht so aus, als ob die Innengröße des ListView größer, als die vorgegebene Größe des WebGadgets ist. Wie kann ich dafür sorgen, dass die Icons automatisch umbrechen sobald die Breite überschritten wurde? Im Klartext: Ich möchte keine horizontale Scrollleiste haben. Geht das? Das wäre klasse. ;)

Re: CreateWindow und Explorer

Verfasst: 25.10.2014 21:12
von RSBasic
Stimmt. Es liegt daran, dass ursprünglich die Detailansicht standardmäßig aktiviert war. Die horizontale Scrollleiste hat was mit der Spaltenbreite aus der vorherigen Ansicht zu tun. Normalerweise ist die Spaltenbreite in dieser Ansicht irrelevant, aber im WebGadget() scheint es etwas anders zu sein.
Code-Fix:

Code: Alles auswählen

EnableExplicit

Define Handle

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  WebGadget(1, 0, 0, WindowWidth(0), WindowHeight(0), "C:\")
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Select EventType()
              Case #PB_EventType_DownloadEnd
                Handle = FindWindowEx_(GadgetID(1), 0, "Shell Embedding", 0)
                Handle = FindWindowEx_(Handle, 0, "SHELLDLL_DefView", 0)
                Handle = FindWindowEx_(Handle, 0, "SysListView32", 0)
                
                SendMessage_(Handle, #LVM_SETVIEW, #LV_VIEW_ICON, 0)
                SetWindowLongPtr_(Handle, #GWL_STYLE, GetWindowLongPtr_(Handle, #GWL_STYLE) | #LVS_NOCOLUMNHEADER)
                SendMessage_(Handle, #LVM_SETCOLUMNWIDTH, 0, 0)
                SendMessage_(Handle, #LVM_SETCOLUMNWIDTH, 1, 0)
                SendMessage_(Handle, #LVM_SETCOLUMNWIDTH, 2, 0)
                SendMessage_(Handle, #LVM_SETCOLUMNWIDTH, 3, 0)
            EndSelect
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: CreateWindow und Explorer

Verfasst: 25.10.2014 21:36
von GronkhLP
:allright: :allright: :allright:

Re: CreateWindow und Explorer

Verfasst: 26.10.2014 13:28
von RSBasic
\\Nachtrag:
Die von mir oben gepostete Lösung funktioniert zwar auch, ist aber für dieses Windows Explorer-Gadget nicht geeignet, da dieses eigene Ansichttypen besitzt und anders verwaltet. Um diese Ansichten besser anzusteuern, muss man stattdessen so machen:

Code: Alles auswählen

EnableExplicit

Define Handle

#OFN_VIEW_LARGEICON = $7029;Mittelgroße Icons
#OFN_VIEW_LIST = $702B;Liste
#OFN_VIEW_REPORT = $702C;Details
#OFN_VIEW_TILE = $702E;Kacheln

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  WebGadget(1, 0, 0, WindowWidth(0), WindowHeight(0), "C:\")
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Select EventType()
              Case #PB_EventType_DownloadEnd
                Handle = FindWindowEx_(GadgetID(1), 0, "Shell Embedding", 0)
                Handle = FindWindowEx_(Handle, 0, "SHELLDLL_DefView", 0)
                
                SendMessage_(Handle, #WM_COMMAND, #OFN_VIEW_LARGEICON, 0)
                
                Handle = FindWindowEx_(Handle, 0, "SysListView32", 0)
                
                SetWindowLongPtr_(Handle, #GWL_STYLE, GetWindowLongPtr_(Handle, #GWL_STYLE) | #LVS_NOCOLUMNHEADER)
                
            EndSelect
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf