CreateWindow und Explorer

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

CreateWindow und Explorer

Beitrag 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. :)
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CreateWindow und Explorer

Beitrag 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
a²+b²=mc²
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: CreateWindow und Explorer

Beitrag von RSBasic »

@GronkhLP
Mit CreateWindow(Ex)_() kannst du soweit ich weiß nur eine einfache ListBox erstellen. Benutze einfach WebGadget(). ;)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: CreateWindow und Explorer

Beitrag 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. :)
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: CreateWindow und Explorer

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CreateWindow und Explorer

Beitrag 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
a²+b²=mc²
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: CreateWindow und Explorer

Beitrag 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. ;)
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: CreateWindow und Explorer

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: CreateWindow und Explorer

Beitrag von GronkhLP »

:allright: :allright: :allright:
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: CreateWindow und Explorer

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten