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

, 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?
Danke für den Tipp!
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
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