Fenster in Fenster (child window)...

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
saimen
Beiträge: 172
Registriert: 26.01.2005 10:44
Wohnort: Passau
Kontaktdaten:

Fenster in Fenster (child window)...

Beitrag von saimen »

wie kann ich das child window über mein Menü schließen:

Code: Alles auswählen

Global hwnd.l,OldProc.l 
hInstance = GetModuleHandle_(0) 

Procedure ChildCallback(Window, Message, wParam, lParam) 
Result = CallWindowProc_(OldProc,Window,Message,wParam,lParam) 
Select Message 
Case #WM_CLOSE 
  DestroyWindow_(Window) 
EndSelect 
ProcedureReturn Result 
EndProcedure 

hwnd.l = OpenWindow(0, 0,0,640,480, "Ich habe ein Kindfenster", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget) 
If hwnd 

Style.l = #WS_POPUP|#WS_CHILD|#WS_CLIPCHILDREN|#WS_VISIBLE|#WS_CAPTION|#WS_MAXIMIZEBOX|#WS_MINIMIZEBOX 
Child.l = CreateWindowEx_(0,"#32770","Ich bin das Kind",Style,0,0,320,240,0,0,hInstance,0) 
OldProc = SetWindowLong_(Child,#GWL_WNDPROC,@ChildCallback()) 
SetParent_(Child,hwnd) 

    If CreateMenu(0, WindowID(0))    ; hier beginnt das Erstellen des Menüs...
      MenuTitle("Project")
        MenuItem(1, "Open Child"   +Chr(9)+"Ctrl+O")
        MenuItem(2, "Close Child"   +Chr(9)+"Ctrl+O")
    EndIf


  Repeat 
    EventID.l = WaitWindowEvent() 
    
    If EventID = #PB_Event_Menu
      Select EventMenu()
        Case 1 :  ;open
        Case 2 :  ;???;close
      EndSelect      
    EndIf
    
    If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button 
      Quit = 1 
    EndIf 
  Until Quit = 1 
EndIf 
End 
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also, wenn du dein child über PB geöffnet hättest, würde ich dir zu CloseWindow() raten.

in diesem Fall schau halt in die MSDN, mit welchem Call du ein Fenster schließt, das du über CreateWindowEx_() geöffnet hast...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
saimen
Beiträge: 172
Registriert: 26.01.2005 10:44
Wohnort: Passau
Kontaktdaten:

Beitrag von saimen »

wie kann ich mein childwindow über pb öffnen?
Möchte ja noch Gadgets etc. einfügen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

OpenWindow(#Window, x, y, InnereBreite, InnereHoehe, Titel$ [, Flags [, ParentWindowID]])

http://www.purebasic.com/german/documen ... indow.html

...


es ist außerdem die Frage, ob du überhaupt childs benötigst.
mehrere fenster kann man auch ohne child/parent lösen.

ein älteres Beispiel (funzt auch mit 4.2):

Code: Alles auswählen

;*********************************************************
;*** MoreWindows.pb
;***
;*** Example for use of EventWindow()
;*** to handle multiple Windows
;*** without child/parent
;***
;*** Dec.22, 2006  Kaeru Gaman
;***
;*** PB Ver 4.02 Win
;*********************************************************
EnableExplicit
;*************************************
Enumeration     ;Windows
  #Win_Main
  #Win_Sub1
  #Win_Sub2
  #Win_Sub3
  #Win_Sub4
EndEnumeration
;*************************************
Enumeration     ;Gadgets
  #Main_But_LaunchSub1
  #Main_But_LaunchSub2
  #Main_But_LaunchSub3
  #Main_Txt_Display
  #Sub1_But_TestBeep 
  #Sub2_But_TestBeep 
  #Sub3_But_LaunchSub4
  #Sub4_Opt_Text1
  #Sub4_Opt_Text2
  #Sub4_Opt_Text3
EndEnumeration
;*************************************
 Procedure OpenSub1()
  OpenWindow(#Win_Sub1, -1, -1, 200,150,"Sub1",#PB_Window_ScreenCentered | #PB_Window_SystemMenu )
    CreateGadgetList(WindowID(1))
      ButtonGadget(#Sub1_But_TestBeep,10,10,60,20,"Beep Deep")
 EndProcedure
;*************************************
 Procedure OpenSub2()
  OpenWindow(#Win_Sub2, -1, -1, 200,150,"Sub2",#PB_Window_ScreenCentered | #PB_Window_SystemMenu )
    CreateGadgetList(WindowID(2))
      ButtonGadget(#Sub2_But_TestBeep,10,10,60,20,"Beep High")
 EndProcedure
;*************************************
 Procedure OpenSub3()
  OpenWindow(#Win_Sub3, -1, -1, 200,150,"Sub3",#PB_Window_ScreenCentered | #PB_Window_SystemMenu )
    CreateGadgetList(WindowID(3))
    ButtonGadget(#Sub3_But_LaunchSub4, 70,110,120,30,"Launch Sub4")
 EndProcedure
;*************************************
 Procedure OpenSub4()
  OpenWindow(#Win_Sub4, -1, -1, 200,150,"Sub4",#PB_Window_ScreenCentered | #PB_Window_SystemMenu )
    CreateGadgetList(WindowID(4))
      OptionGadget(#Sub4_Opt_Text1,20,20,160,20,"Beef")
      OptionGadget(#Sub4_Opt_Text2,20,50,160,20,"Lamb")
      OptionGadget(#Sub4_Opt_Text3,20,80,160,20,"Fish")
 EndProcedure
;*************************************
OpenWindow(#Win_Main,0,0,320,240,"Main", #PB_Window_ScreenCentered | #PB_Window_SystemMenu )
  CreateGadgetList(WindowID(0))
    ButtonGadget(#Main_But_LaunchSub1,190,120,120,30,"Launch Sub1")
    ButtonGadget(#Main_But_LaunchSub2,190,160,120,30,"Launch Sub2")
    ButtonGadget(#Main_But_LaunchSub3,190,200,120,30,"Launch Sub3")
    TextGadget(#Main_Txt_Display,10,10,160,20, "No Choice yet", #PB_Text_Border)
;*************************************
Define Event.l
Define EXIT.l
Define DisplayTxt$ = "Your Choice is "
;*************************************
Repeat
  Event = WaitWindowEvent()
  Select EventWindow()
;*********************************************************
;*** Main Window
;*********************************************************
    Case   #Win_Main
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EventGadget()
            Case #Main_But_LaunchSub1
              OpenSub1()
            Case #Main_But_LaunchSub2
              OpenSub2()
            Case #Main_But_LaunchSub3
              OpenSub3()
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          EXIT = 1
      EndSelect
;*********************************************************
;*** Sub Window 1
;*********************************************************
    Case #Win_Sub1
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EventGadget()
            Case #Sub1_But_TestBeep
              Beep_( 500,300)
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          CloseWindow(#Win_Sub1)
      EndSelect
;*********************************************************
;*** Sub Window 2
;*********************************************************
    Case #Win_Sub2
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EventGadget()
            Case #Sub2_But_TestBeep
              Beep_(1500,300)
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          CloseWindow(#Win_Sub2)
      EndSelect
;*********************************************************
;*** Sub Window 3
;*********************************************************
    Case #Win_Sub3
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EventGadget()
            Case #Sub3_But_LaunchSub4
              OpenSub4()
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          CloseWindow(#Win_Sub3)
      EndSelect
;*********************************************************
;*** Sub Window 4
;*********************************************************
    Case #Win_Sub4
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EventGadget()
            Case #Sub4_Opt_Text1
              SetGadgetText(#Main_Txt_Display, DisplayTxt$ + "Beef")
            Case #Sub4_Opt_Text2
              SetGadgetText(#Main_Txt_Display, DisplayTxt$ + "Lamb")
            Case #Sub4_Opt_Text3
              SetGadgetText(#Main_Txt_Display, DisplayTxt$ + "Fish")
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          CloseWindow(#Win_Sub4)
      EndSelect
;*********************************************************
;*** End of Window List
;*********************************************************
  EndSelect
Until EXIT = 1
End
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag von Ligatur »

Wenn du bei deiner Methode bleiben willst steht die Lösung eigendlich schon in deinem Callback. Du sendest zum Schließen einfach ein #WM_CLOSE an dein Fenster (Sendmessage_(Child, #WM_Close, 0, 0).
Zum erstellen musst du dann natürlich wieder CreateWindowEx_() benutzen, du musst dabei aber mit IsWindow(Child) überprüfenm ob das Fenster bereits existiert damit du nicht versehentlich mehrere Fenster erstellst.
Währe es aber nicht eleganter und auch einfacher und übersichtlicher statt der Fensterklasse "#32770" eine eigene mit RegiserClass_() zu erzeugen?
Außerdem könntest du das Childfenster auch verstecken und wieder anzeigen (mit ShowWindow_()) statt es immer wieder zu schliessen und neu zu erstellen falls nichts Anwendungsspezifisches dagegenspricht.
Benutzeravatar
saimen
Beiträge: 172
Registriert: 26.01.2005 10:44
Wohnort: Passau
Kontaktdaten:

Beitrag von saimen »

hab das jetzt pb gelöst, dann kann ich einfacher Gadgets einfügen und brauch keine API's. Schließen und öffnen tue ich es dann mit hidde...

Gibts eine möglichkeit dass ich dieses Childfenster nicht über das Parentfenster hinaus verschieben kann?
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

saimen hat geschrieben:Gibts eine möglichkeit dass ich dieses Childfenster nicht über das Parentfenster hinaus verschieben kann?
schau Dir mal das MDIGadget() in der PB-Hilfe an.

Grüße ... Kiffi
a²+b²=mc²
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

bei ChildWindows denke ich sofort immer an MDI.

Allerdings kann man beim MDI auch das Fenster über die Ränder des MDIs
hinausverschieben.

Gibt zwar einen Flag, der da keine Scrollbalken mehr anzeigt, aber das ist
eher unschön.
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Allerdings kann man beim MDI auch das Fenster über die Ränder des MDIs hinausverschieben.

aber nur unter den Rand, das MDI-Child befindet sich immer innerhalb des MDI-Parent.

bei einem normalen Child-Parent kann sich das Child komplett außerhalb des Parent auf dem Desktop befinden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

ja, das stimmt.
aber wenn sich das ChildWindow unter dem Rand des MDI befindet, nützt
es auch keinem mehr...
aber aus dem MDI kann man es natürlich nicht schieben. Dann wäre's ja
sinnlos.
Win11 x64 | PB 6.20
Antworten