Ein minimiertes Fenster normal anzeigen

Anfängerfragen zum Programmieren mit PureBasic.
aspicza
Beiträge: 11
Registriert: 18.04.2006 07:23
Kontaktdaten:

Ein minimiertes Fenster normal anzeigen

Beitrag von aspicza »

Hallo!

Gleich vorweg: Ich habe bereits hier im Forum nach einer Lösung gesucht - aber keine gefunden. Dehalb schreibe ich nun mein Problem.

Ich habe ein Fenster, das beim Starten des Programms geöffnet wird. Wenn eine Bedingung erfüllt ist, dann öffnet sich ein zweites Fenster, welches nur geschlossen werden kann. Es dient auch nur als Hinweisfenster - so nach dem Motto: "Hier ist was passiert. Bitte drum kümmern!" . Bis dato gibt es auch kein Problem, aber...

Mein erstes Fenster soll nun nicht immer auf dem Desktop sichtbar sein, deshalb wird es der Benutzer minimieren. Und jetzt das Problem: Wenn die Bedingung erfüllt ist, so dass das Hinweisfenster geöffnet wird, dann passiert das auch, aber es ist nur in der Taskleiste zu sehen!!!

Wenn mein erstes Fenster nicht minimiert ist, dann funktioniert alles prima!

Wie bereits erwähnt habe ich bereits etliche ShowWindow_ SetForegroundWindow_ und SetWindowPos_ ausprobiert, aber anscheinend nicht richtig.

Bitte helft mir!

Hier mein Code:

Code: Alles auswählen

OpenWindow(0, 329, 99, 799, 300,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar , "Programm")

datum.l=Date()

zeile=10

Repeat
event=WindowEvent()

       
    verstrichen.l=Date()

    

    If verstrichen-datum>10
    
        datum+9
        
        tickets.l=0
        
        If tickets<zeile
           OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "NEUER HINWEIS")
          
           ShowWindow_(WindowID(0),#SW_RESTORE)       
           ShowWindow_(WindowID(1),#SW_RESTORE)
           ; SetForegroundWindow_(WindowHandle) 
           tickets=zeile
        EndIf
      
        
        tickets.l=zeile
    
    EndIf

    If event=#PB_Event_CloseWindow And EventWindowID()=1
      CloseWindow(1)     
    EndIf

Delay(100)
Until event=#PB_Event_CloseWindow And EventWindowID()=0
End
Das ist der letzte meiner vielen Versuche gewesen. Auch habe ich mit UseWindow(), ActivateWindow() und HideWindow() rumprobiert. Aber es klappte einfach alles nicht.

Carpe Diem

Arndt
Zuletzt geändert von aspicza am 23.04.2006 09:52, 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 »

Funktionierender Code wäre nett, ansonsten kann man nichts testen!
1. bin zu Faul einen funktionierenden Code draus zu machen
2. oftmals liegt der Fehler im nicht vorhandenen Code

Auf jedenfall ist die Windowsschleife nicht gut so, WaitWindowsEvent() sollte
es schon sein. Die Fenster in der Schleife müssen unterschieden werden.
Mehr kann ich ohne Code nicht sagen.
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
aspicza
Beiträge: 11
Registriert: 18.04.2006 07:23
Kontaktdaten:

SORRRRYYYYY :-)

Beitrag von aspicza »

Habe gerade meinen Code editiert. Nun kann man ihn einfach kopieren. Er läuft jetzt.

Werde darauf in Zukunft besonders achten...

Tschuldigung
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 »

Ich weiß jetzt nicht genau was es werden soll :wink: , aber vielleicht hilft es ja:

Code: Alles auswählen

OpenWindow(0, 329, 99, 799, 300,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar , "Programm")
OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible, "NEUER HINWEIS")

datum.l=Date()

zeile=10

event=#PB_Event_CloseWindow And EventWindowID()=0
Repeat
event=WindowEvent()

       
    verstrichen.l=Date()

   

    If verstrichen-datum>10
   
        datum+9
       
        tickets.l=0
       
        If tickets<zeile
           ;OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "NEUER HINWEIS")
            HideWindow(1, #False)
            SetForegroundWindow_(WindowID(1))
           ;ShowWindow_(WindowID(0),#SW_RESTORE)       
           ;ShowWindow_(WindowID(1),#SW_RESTORE)
           ; SetForegroundWindow_(WindowHandle)
           tickets=zeile
        EndIf
     
       
        tickets.l=zeile
   
    EndIf

    If event=#PB_Event_CloseWindow And EventWindowID()=1
      HideWindow(1, #True)     
    EndIf

Delay(100)
Until event=#PB_Event_CloseWindow And EventWindowID()=0
End
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
aspicza
Beiträge: 11
Registriert: 18.04.2006 07:23
Kontaktdaten:

Beitrag von aspicza »

Hallo!

@ts-soft: Leider funktioniert es nicht. Aber Deine Varaiante hat mich über die Funktion IsWindow() stolpern lassen :-) Vielen Dank!

Und nun funktioniert es auch!

Hier der Code für alle mit dem gleichen Problem:

Code: Alles auswählen

OpenWindow(0, 329, 99, 799, 300,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar , "Programm") 
OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible, "NEUER HINWEIS") 

datum.l=Date() 

zeile=10 

event=#PB_Event_CloseWindow And EventWindowID()=0 
Repeat 
event=WindowEvent() 

        
    verstrichen.l=Date() 

    

    If verstrichen-datum>10 
    
        datum+9 
        
        tickets.l=0 
        
        If tickets<zeile 
           If IsWindow(1)=#False : OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "NEUER HINWEIS") : EndIf
            HideWindow(1, #False) 
            SetForegroundWindow_(WindowID(1)) 
             tickets=zeile 
        EndIf 
      
        
        tickets.l=zeile 
    
    EndIf 

    If event=#PB_Event_CloseWindow And EventWindowID()=1 
      CloseWindow(1)      
    EndIf 

Delay(100) 
Until event=#PB_Event_CloseWindow And EventWindowID()=0 
End
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 »

Warum erstellst Du das Fenster immer Neu? Verstecken würde doch reichen.
Für Deine Ereignisschleife solltest Du vielleicht einen Timer einsetzen und auf
WaitWindowEvent() umstellen. Ansonsten reagiert es nicht auf jedes Ereignis
und die CPU hat mehr Luft um andere Programme zu verarbeiten :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
aspicza
Beiträge: 11
Registriert: 18.04.2006 07:23
Kontaktdaten:

Beitrag von aspicza »

Hallo!

@ts-soft: Das wollte ich auch, aber wenn ich das Fenster nur versteckt habe, nachdem auf den Close-Button geklickt wurde, wurde merkwürdigerweise auch mein erstes Fenster geschlossen und damit das Programm nicht gewollt beendet.

Code: Alles auswählen

If event=#PB_Event_CloseWindow And EventWindowID()=#Window_1
      HideWindow(#Window_1,1)     
    EndIf
Das ich nicht WaitWindowEvent() benutze liegt an meiner Information, dass WaitWindowEvent() die Programmausführung anhält und wartet bis was passiert. Da ich aber darauf warte, dass 10 Sekunden verstreichen, habe ich mich für WindowEvent() entschlossen und einem Delay am Ende der Schleife, damit die CPU-Arbeit auch noch andere Programme abbekommen. Oder habe ich die Funktionen missverstanden??? Ich gehe davon aus, dass nach dem Befehl WaitWindowEvent das Programm wirklich "steht".
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 Programm steht, ist richtig. Das ist für Anwendungen auch erforderlich, um nicht das ganze System zu belasten, und weil sonst alle Ereignisse, die während des Delays den Jordan hinunter gehen, verloren gehen.

Ein Timer (entweder die Lib aus PBOSL oder per API) durchbricht diesen Halt, bzw. Arbeitet das Ereignis in einem Callback ab.

Am einfachsten wäre es, wenn Du PB4 Beta verwendest, da kannste
event = waitwindowevent(100) verwenden, wobei dann alle 100 ms die
Schleife auch ohne Ereignis abgearbeitet wird.

Hier nochmal ein andere Code mit Timer, Timer steht auf 20 Sek,

Code: Alles auswählen

Procedure Timer()
  If IsWindow(1) = #False
    OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible, "NEUER HINWEIS")
  EndIf
  HideWindow(1, #False)
  SetForegroundWindow_(WindowID(1))
EndProcedure

OpenWindow(0, 329, 99, 799, 300,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar , "Programm")
OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible, "NEUER HINWEIS")
SetTimer_(WindowID(0), 0, 20000, @Timer())
Repeat
  event=WaitWindowEvent()
  windID = EventWindowID()
  If event=#PB_Event_CloseWindow And windID = 1
    CloseWindow(1)    
  EndIf
Until event=#PB_Event_CloseWindow And windID = 0
KillTimer_(WindowID(0), 0)
End
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
aspicza
Beiträge: 11
Registriert: 18.04.2006 07:23
Kontaktdaten:

Beitrag von aspicza »

Hallo!

@ts-soft: Diese Variante finde ich sehr elegant :-) *DANKE*
Antworten