Parentwindow und Childwindow

Für allgemeine Fragen zur Programmierung mit PureBasic.
Calloway
Beiträge: 106
Registriert: 15.09.2004 23:26

Parentwindow und Childwindow

Beitrag von Calloway »

Hallo!

Es gibt schon einige Threads zum Thema Childwindow, aber eine endgültige Antwort auf mein Problem habe ich nicht gefunden.

Ich möchte ein Window nach Buttonklick aufmachen. Wenn ich ganz normal mit Openwindow verfahre, wird in der Taskleiste ein neuer Eintrag erstellt. Ferner lässt sich das Fenster auch in den Hintergrund schalten.

Wie erreiche ich es, dass das Childwindow immer VOR dem Parentwindow erscheint, aber nicht automatisch vor ALLEN Fenstern (das war immer der Knackpunkt bisher), d.h. wenn ich andere Programme in der Taskleiste aktiviere, dass dann auch das Childwindow in den Hintergrund verschwindet. Wenn ich dann das Parentwindow wieder aktiviere, sollte dann auch das Childwindow wieder über dem Paarentwindow zu sehen sein.
Wie erreiche ich es, dass nicht für jedes neu eröffnete Childwindow ein neuer Eintrag in der Taskleiste erscheint? Ist ja bei anderen Programmen auch nicht so.
Wie erreiche ich es, dass, wenn ein ein Childwindow geöffnet ist, das Parentwindow keine Eingaben mehr zulässt (also quasi ein Sanduhr-Maus erscheint)?
--
Gruß, Martin.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Parentwindow und Childwindow

Beitrag von Danilo »

Calloway hat geschrieben:Ich möchte ein Window nach Buttonklick aufmachen. Wenn
ich ganz normal mit Openwindow verfahre, wird in der
Taskleiste ein neuer Eintrag erstellt.
Ferner lässt sich das Fenster auch in den Hintergrund schalten.
Du mußt bei OpenWindow() den letzten (optionalen) Parameter
WindowID() vom Hauptfenster angeben. Löst beide Probleme.
Calloway hat geschrieben:Wie erreiche ich es, dass, wenn ein ein Childwindow geöffnet ist,
das Parentwindow keine Eingaben mehr zulässt
Mit EnableWindow_().
Calloway hat geschrieben:(also quasi ein Sanduhr-Maus erscheint)?
Das habe ich leider nicht hinbekommen, da daß deaktivierte
Fenster keine Messages mehr verarbeitet, und somit der
Standard-Cursor genommen wird.

Vielleicht reicht es ja trotzdem so:

Code: Alles auswählen

Procedure Win1(value)
  OpenWindow(1,0,0,400,200,#PB_Window_SystemMenu|#PB_Window_WindowCentered,"Child",WindowID(0))
    CreateGadgetList(WindowID())
    ButtonGadget(1,290,170,100,20,"Schließen")
  
  ; HauptFenster de-aktivieren
  EnableWindow_(WindowID(0),0)

  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        If EventWindowID() = 1 ; Child schliessen
          close = 1
        EndIf
      Case #PB_Event_Gadget
        Select EventGadgetID()
          Case 1               ; Child schliessen
            close = 1
        EndSelect
    EndSelect
  Until close

  ; HauptFenster re-aktivieren
  EnableWindow_(WindowID(0),1)

EndProcedure


OpenWindow(0,0,0,300,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Hauptfenster")
  CreateGadgetList(WindowID())
  ButtonGadget(0,10,10,100,20,"Fenster öffnen")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      If EventWindowID() = 0 ; Hauptfenster schliessen
        Break
      EndIf
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case 0
          CreateThread(@Win1(),0)
      EndSelect
  EndSelect
ForEver
Mit MakeToolWindow() aus den PureTools (siehe Signatur)
kannst Du auch ganz leicht unabhängige ToolWindows machen,
die nicht in der Taskleiste angezeigt werden - aber der obige
Weg sollte Dir ja reichen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Calloway
Beiträge: 106
Registriert: 15.09.2004 23:26

Beitrag von Calloway »

Thanks für Deinen Code. :allright: Sieht sehr gut aus. Die PureTools hatte ich schon installiert, aber den Befehl MakeToolWindow() hatte ich noch nicht realisiert. :roll:

Wieder mal ein Stück weiter für mein Programm in Richtung Perfektion. :)
--
Gruß, Martin.
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

@Danilo
Du öffnest das Child Window in einem Thread. Um kurz auf den Punkt zu kommen:
Warum? :)

Im Anbetracht des Fakts, dass das Hauptfenster doch ohnehin keine
Events mehr empfängt, muss doch der Hauptthread auch nicht
weiterlaufen - Im Gegenteil, es wundert mich, dass das funktioniert, da
doch eigentlich durch die 2. laufende Eventschleife Events "verloren"
gehen müssen. Es läuft jedoch hier, evtl. kannst du da etwas Licht in meine Dunkelheit bringen? :wink:
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Jeder Thread hat seine eigene Message-Queue.

Oder meintest du was anderes? /:->
Antworten