Minimiertes Fenster wieder darstellen

Anfängerfragen zum Programmieren mit PureBasic.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

dann mach :

Code: Alles auswählen

while isthread(thread)
delay(100)
wend
debug "fertig"
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@axerus
funktioniert zwar, aber ist doch am thema vorbei.
mindestens ein windowevent sollte drin sein.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Das Beispiel von mk-soft mal erweitert, mehr Themenbezogen.

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #ButtonGadget_0
EndEnumeration

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, #PB_Ignore, 0, 157, 85, "#Window_0")
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#ButtonGadget_0, 35, 25, 95, 30, "Start")
    EndIf
  EndIf
EndProcedure

OpenWindow_Window_0()

Global ThreadActiv.l

Procedure MyThread(ID)
  For i = 0 To 10 ;
    Delay(1000)
  Next i
  DisableGadget(#ButtonGadget_0, #False)
  ThreadActiv = #False
EndProcedure

Repeat
  Event = WaitWindowEvent(100)
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()

      If EventGadget = #ButtonGadget_0
        If ThreadActiv = #False
          SetWindowState(#Window_0, #PB_Window_Minimize)
          DisableGadget(#ButtonGadget_0, #True)
          hThread = CreateThread(@MyThread(), 0)
          If hThread
            ThreadActiv = #True
          EndIf
        EndIf
      EndIf
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        If ThreadActiv = #True
          KillThread(hThread)
        EndIf
        Break
      EndIf
    Default
      If ThreadActiv = #False
        SetWindowState(#Window_0, #PB_Window_Normal)
      EndIf
  EndSelect
ForEver
Keine Garantie, das dies Sicher ist :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Ich habe mir angewöhnt per PostMessage() mit der Hauptschleife zu kommunizieren.
So kann man im Prinzip alle Gadget-Relevanten Abläufe da verarbeiten, wo sie hingehören (also nicht in den Thread).

Nachteil ist natürlich, dass es nen Api-Aufruf ist.
(Wie wäre denn das Linux-Pendant ?)

Beispiel:

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #ButtonGadget_0
EndEnumeration

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, #PB_Ignore, 0, 157, 85, "#Window_0")
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#ButtonGadget_0, 35, 25, 95, 30, "Start")
    EndIf
  EndIf
EndProcedure

OpenWindow_Window_0()

Procedure MyThread(ID)
  For i = 0 To 10 ;
    Delay(1000)
  Next i
  PostMessage_(WindowID(#Window_0), #WM_USER, #Null, #Null)
EndProcedure

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()

      If EventGadget = #ButtonGadget_0
        If IsThread(hThread) = #False
          SetWindowState(#Window_0, #PB_Window_Minimize)
          DisableGadget(#ButtonGadget_0, #True)
          hThread = CreateThread(@MyThread(), 0)
        EndIf
      EndIf
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        If IsThread(hThread)
          KillThread(hThread)
        EndIf
        Break
      EndIf
    Case #WM_USER
    	DisableGadget(#ButtonGadget_0, #False)
      SetWindowState(#Window_0, #PB_Window_Normal)
  EndSelect
ForEver
Zuletzt geändert von HeX0R am 31.10.2006 15:50, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Gute Sache mit PostMessage :allright:

Event = WaitWindowEvent() ohne 100 reicht dann aber :mrgreen:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

uuups, da hast du natürlich völlig recht!
Gleich mal korrigieren.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

Kaeru Gaman hat geschrieben:@axerus
funktioniert zwar, aber ist doch am thema vorbei.
mindestens ein windowevent sollte drin sein.
War nur auf das viorherige Post bezogen, weil die repeat ein wenig umständlich war
Antworten