Mehrere Fenster

Anfängerfragen zum Programmieren mit PureBasic.
Salami
Beiträge: 41
Registriert: 18.02.2005 09:42
Kontaktdaten:

Mehrere Fenster

Beitrag von Salami »

Ich hab ein großes Problem!
Also ich hab ein Programm gemacht und da gibt es im Menu Optionen und und wenn man draufklickt soll sich ein 2. Fenster mit den Optionen öffnen. Wenn man das wieder schliesst, soll man im "normalen" Fenster weitermachen können.
Das mit dem öffnen funktioniert ja auch, aber sobald das Optionen-Fenster geöffnet wird, verschwinden die Gadgets im ersten Fenster und das bleibt so auch wenn ich die Optionen wieder schliesse.
Im Optionsfenster ist eigetnlich auch das:

Code: Alles auswählen

If OptionsWEvent=#PB_Event_CloseWindow
UseWindow(0):ActivateWindow()
CloseWindow(1)
EndIf
:freak:
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

Probier das mal:

Code: Alles auswählen

OpenWindow(0,0,0,200,200,#pb_window_systemmenu,"test")
CreateGadgetList(WindowID(0))
ButtonGadget(0,50,50,100,100,"neues fenster")

OpenWindow(1,200,200,200,200,#pb_window_systemmenu,"test")
CreateGadgetList(WindowID(1))
ButtonGadget(1,50,50,100,100,"schließen")

HideWindow(1,1)

Repeat

If WaitWindowEvent() = #pb_event_gadget
  Select eventGadgetID()
    Case 0
      HideWindow(1,0)
    Case 1
      HideWindow(1,1)
  EndSelect
endif

Until WaitWindowEvent() = #pb_event_closewindow
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Salami
Beiträge: 41
Registriert: 18.02.2005 09:42
Kontaktdaten:

Beitrag von Salami »

Also... ich geb dir einfach mal den ganzen Code.
Deine Methode ist zwar gut, geht aber nicht so richtig...
Ich glaub es hat was mit den gadgets zu tun.....

Code: Alles auswählen

Procedure OpenOptionWindow(ScreenWidth, ScreenHeight)
  OpenWindow(1, ScreenWidth-350, ScreenHeight-300, 310, 100, #PB_Window_SystemMenu, "Optionen")
  
  If OpenPreferences("prefs.ini")
    screenshotdir$=ReadPreferenceString("screenshotdir", "C:\")
    screenshotres=ReadPreferenceLong("screenshotres", 1)
    screenshotquality=ReadPreferenceLong("screenshotquality", 7)
    ClosePreferences()
  EndIf
  
  CreateGadgetList(WindowID(1))
  TextGadget(0, 5, 5, 300, 15, "Verzeichnis in dem die Screenshots gespeichert werden sollen:")
  StringGadget(1, 5, 22, 200, 20, screenshotdir$)
  ButtonGadget(2, 210, 22, 90, 20, "Durchsuchen...")
  TextGadget(3, 5, 47, 90, 15, "Bildqualität(1-10):")
  StringGadget(4, 95, 45, 30, 20, Str(screenshotquality))
  TextGadget(5, 135, 47, 90, 15, "Bildgrösse:")
  ComboBoxGadget(6, 200, 45, 100, 100)
    AddGadgetItem(6,-1,"320x240")
    AddGadgetItem(6,-1,"640x480")
    AddGadgetItem(6,-1,"800x600")
    AddGadgetItem(6,-1,"1024x768")
  ButtonGadget(7, 5, 72, 90, 20, "Übernehmen")
  ButtonGadget(8, 100, 72, 90, 20, "Schliessen")
  
  SetGadgetState(6, screenshotres)
  
  Repeat
    
    OptionsWEvent=WaitWindowEvent()
    
    If OptionsWEvent=#PB_Event_Gadget
      If EventGadgetID()=7
        DisableGadget(7, 1)
      EndIf
      If EventGadgetID()=2
        file$=PathRequester("Pfad angeben", "C:\")
        If file$
          SetGadgetText(1, file$)
        EndIf
      EndIf
      If EventGadgetID()=8
        CloseWindow(1)
      EndIf
    EndIf
    
    If OptionsWEvent=#PB_Event_CloseWindow
      UseWindow(0):ActivateWindow()
      CloseWindow(1)
    EndIf
    
  ForEver
EndProcedure

Procedure MakeDesktopSCREENSHOT(ImageNr,x,y,Width,Height) 
  hImage = CreateImage(ImageNr,Width,Height) 
  hdc    = StartDrawing(ImageOutput()) 
  DeskDC = GetDC_(GetDesktopWindow_()) 
  BitBlt_(hdc,0,0,Width,Height,DeskDC,x,y,#SRCCOPY) 
  StopDrawing() 
  ReleaseDC_(GetDesktopWindow_(),DeskDC) 
  ProcedureReturn hImage 
EndProcedure 

If OpenPreferences("prefs.ini")=0
  If CreatePreferences("prefs.ini")
    WritePreferenceString("screenshotdir", "C:\")
    WritePreferenceLong("screenshotres", 1)
    WritePreferenceLong("screenshotquality", 7)
    MessageRequester("Bitte lesen! Erster Programmstart!", "Du startest dieses Programm das erste Mal."+Chr(10)+Chr(13)+"Bitte Stelle zuerst alles in den Optionen auf deine Wünsche ein. (nicht viel Arbeit)"+Chr(10)+Chr(13)+"Das Programm erstellt ein Tray-Icon (rechts unten in der Taskleiste)."+Chr(10)+Chr(13)+"Wenn du das Fenster geschlossen hast läuft das Programm immer noch im Hintergrund weiter."+Chr(10)+Chr(13)+"Klicke auf das Tray-Icon um das Fenster wieder aufzudecken."+Chr(10)+Chr(13)+"Falls du das Programm beenden willst, öffne das Fenster und Klicke im Menü auf Optionen und dann auf beenden."+Chr(10)+Chr(13)+"Viel Spass!")
    ClosePreferences()
  Else
    MessageRequester("Fehler", "Konnte keine Config-Datei erstellen!")
    End
  EndIf
Else
  ClosePreferences()
EndIf

ExamineDesktops()

ScreenWidth=DesktopWidth(0)
ScreenHeight=DesktopHeight(0)
i=1

OpenWindow(0, ScreenWidth-320, ScreenHeight-250, 300, 150, #PB_Window_SystemMenu, "ScreenshotGrabber by Salami")

LoadImage(0, "icon4.ico")
UseImage(0)
AddSysTrayIcon(0, WindowID(), ImageID())

CreateMenu(0, WindowID(0))
MenuTitle("Optionen")
MenuItem(0, "Optionen")
MenuBar()
MenuItem(1, "Beenden")
MenuTitle("Hilfe")
MenuItem(2, "Hilfe/About")

CreateGadgetList(WindowID(0))
TextGadget(0, 5, 5, 290, 15, "Gemachte Screenshots:")
ListViewGadget(1, 5, 23, 290, 100)

;-Hauptschleife

Repeat
  
  WEvent=WaitWindowEvent()
  
  If WEvent=#PB_Event_CloseWindow
    HideWindow(0, 1)
  EndIf
  
  If WEvent=#PB_Event_SysTray
    HideWindow(0, 0)
  EndIf
  
  If WEvent=#PB_Event_Menu
    If EventMenuID()=0
      OpenOptionWindow(ScreenWidth, ScreenHeight)
    EndIf
    If EventMenuID()=1
      End
    EndIf
    If EventMenuID()=2
      MessageRequester("About ScreenshotGrabber", "Gemacht von Salami, www.codingtuts.dl.am"+Chr(10)+Chr(13)+Chr(10)+Chr(13)+"Einfach das Programm im Hintergrund laufen lassen und so viele Screenshots machen wie gewünscht."+Chr(10)+Chr(13)+"Die Dateien befinden sich dann in dem bei den Optionen angegebenen Ordner."+Chr(10)+Chr(13)+Chr(10)+Chr(13)+"Anleitung(wird auch beim ersten Programmstart gezeigt):"+Chr(10)+Chr(13)+"Bitte Stelle zuerst alles in den Optionen auf deine Wünsche ein. (nicht viel Arbeit)"+Chr(10)+Chr(13)+"Das Programm erstellt ein Tray-Icon (rechts unten in der Taskleiste)."+Chr(10)+Chr(13)+"Wenn du das Fenster geschlossen hast läuft das Programm immer noch im Hintergrund weiter."+Chr(10)+Chr(13)+"Klicke auf das Tray-Icon um das Fenster wieder aufzudecken."+Chr(10)+Chr(13)+"Falls du das Programm beenden willst, öffne das Fenster und Klicke im Menü auf Optionen und dann auf beenden.")
    EndIf
  EndIf
  
  If GetAsyncKeyState_(#VK_SNAPSHOT)
    UseJPEGImageEncoder()
    MakeDesktopSCREENSHOT(1, 0, 0, ScreenWidth, ScreenHeight)
    ResizeImage(1, 640, 480)
    SaveImage(1, "C:\screenshot_"+Str(i)+".jpg", #PB_ImagePlugin_JPEG, 5)
    AddGadgetItem(1, -1, "Screenshot "+Str(i))
    i+1
  EndIf
  
ForEver
<)
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

Ich glaube ich finde keinen fehler in deinem code. sry
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
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 »

Ist doch ganz klar.
Du darfst eine GadgetID nicht zweimal vergeben. Auch nicht in zwei verschiedenen Fenstern.
Da du im Hauptfenster (WindowID = 0) Gadgets mit den IDs 0 und 1 erstellst, darfst du im Optionenfenster (WindowID = 1) nicht wieder Gadgets mit den IDs 0 und 1 erstellen.
Das ist auch logisch so, denn wir sonst solltest du mit den weiteren Gadgetbefehlen wie z.B. [c]GetGadgetState()[/c] das richtige Gadget benutzen können?
Salami
Beiträge: 41
Registriert: 18.02.2005 09:42
Kontaktdaten:

Beitrag von Salami »

Oh, hab gedacht das gilt immer nur fürs aktive Fenster... Danke!!!!!!! :D
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Tipp:
Versuchs mal mit der automatischen, ultimativen, coolen, Nummeration in PB.

Code: Alles auswählen

Enumeration
#hauptfenster
#hauptfenster_knopf
#optionsfenster
#optionsfenster_speichern
EndNumeration

OpenWindow(#hauptfenster, 0, 0, 100, 100, #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(#hauptfenster)
  ButtonGadGet(#hauptfenster_knopf, ...parameter...)
OpenWindow(#optionsfenster, 0, 0, 50, 50, |#PB_Window_WindowCentered, #hauptfenster)
CreateGadgetList(#optionsfenster)
  ButtonGadget(optionsfenster_speichern, ...bblabla, andere parameter...)
Steht auch in der Hilfe. zwischen Enumeration und EndNumeration wird jeder Konstanten, die du als ID f. d. gadgets nehmen kannst, eine laufende Nummer zugewiesen. #hauptfenster wäre hier 1, #hauptfenster_knopf wäre hier 2, usw... In der Hilfe steht sogar, wie du statt 1, 2, 3... sozusagen eine 2er Reihe vergeben kannst uvm...

MfG, AND51
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten