Seite 1 von 2

Gelöst: Mehrere Fenster (openwindow)

Verfasst: 24.01.2017 10:24
von Diogenes
Hallo,

gibt es eine Möglichkeit, ein Fenster innerhalb eines Fensters zu öffnen und es im übergeordneten Fenster quasi
festzutackern, so dass - wenn man das übergeordnete Fenster auf dem Bildschirm verschiebt - das untergeordnete
Fenster dann mit verschoben wird.
Noch 'mal zur Erklärung:
Ich habe ein Fenster geöffnet: mein Hauptspielefenster, hier finden alle Aktionen statt. Es gibt eine gestaltetes Spielfeld,
welches auch Veränderungen unterworfen ist. Ich möchte jetzt über ein anderes Fenster Veränderungen vornehmen.

=> OpenWindow(2,li,ob,br,ho,"Ship-Trader",#PB_Window_Tool,winid).

so weit so gut, wenn ich jetzt aber das parentwindow verschiebe, bleibt das 2 Fenster an seinem Platz im Vordergrund
stehen. Geht es, dass ich die beiden Fenster miteinander verbinden kann.
Ich hatte gehofft, daß das durch die Parentwindow-Angabe schon direkt erledigt wird, wofür ist die sonst gut ?
Danke für Eure Hilfe.

Re: Mehrere Fenster (openwindow)

Verfasst: 24.01.2017 10:38
von NicTheQuick
In der Windows-Version von Purebasic gibt es das MDIGadget. Vielleicht entspricht das deine Vorstellungen?

Re: Mehrere Fenster (openwindow)

Verfasst: 24.01.2017 11:53
von Bisonte
Wenn du deine "zusätzlichen" Fenster allerdings auch ausserhalb des Hauptfensters verschieben möchtest, ist das MDIGadget unpassend.

Andere Möglichkeit wäre :
Check ob Hauptfenster bewegt wurde.
Wenn bewegt, Koordinaten ermitteln und per ResizeWindow() andere Fenster "mitbewegen"

Per BindEvent(#PB_Event_SizeWindow...) wäre das unter allen OS möglich.

Re: Mehrere Fenster (openwindow)

Verfasst: 24.01.2017 18:02
von Diogenes
Hallo;

@NictheQuick - Da hast Du Deinem Namen aber wieder alle Ehre gemacht. Frage 10:24 Antwort10:38 Uhr :D
Das MDI-Gadget hatte ich bisher noch gar nicht wahrgenommen, werde es aber heute abend 'mal ausprobieren
Danke für den Tip.

@Bisonte - danke für den Hinweis, aber so wichtig ist es nun auch nicht, daß ich dafür etra Prozeduren schreibe,
um die neuen Koordinaten des Haupfensters zu ermitteln und dann das Nebenfenster auch noch zu verschieben.
Das wird ein Spieler ja auch eher selten machen. Mir war es nur gestern abend aufgefallen, daß das zweite Fenster,
obwohl untergeordnet, nicht mitbewegt wird. Wofür ist denn die Unterordnung des Fensters dann gut, wenn es sowieso
eigenständig ist ?

Ich werde heute abend noch ein wenig weiterbasteln und gebe dann Bescheid.
Danke für Eure Hilfe.

Re: Gelöst: Mehrere Fenster (openwindow)

Verfasst: 25.01.2017 10:05
von Diogenes
Hallo,

es ist eigentlich ganz einfach, ich habe nur in die falsche Richtung gedacht.
Ich mache einfach ein zweites Canvas-gadget auf. Auf dem kann ich dann ja
alle Aktionen durchführen.

Danke für Eure Hilfe

Re: Mehrere Fenster (openwindow)

Verfasst: 25.01.2017 15:22
von Diogenes
Es tut mir leid, aber ich muss den Thread noch'mal wiederaufleben lassen.
Offensichtlich habe ich die Sache mit den Gadgets und windows noch nicht verstanden.
Folgendes soll passieren:
Mein Hauptspielefenster ist geöffnet: An der rechten Seite befinden sich mehrere Buttons
untereinander. Wenn ich mit der Maus auf den ersten Button klicke dann geht ein Fenster, Gadget
oder was auch immer auf, welches mir Informationen anzeigt und wo ich auch eine Auswahl in einem
Menu treffen kann. Ausserdem befindet sich hier ein exit-Button. Klicke ich auf Exit, geht das
Fenster, das Gadget oder was auch immer wieder zu und alles ist wie vorher.
Klicke ich auf den zweiten Button im Hauptfenster geht ein anderes Fenster, Gadget oder was auch
immer auf. usw.
Ich habe das mal mit dem folgenden Code probiert.
Wenn ich auf den blauen button klicke, dann öffnet sich das Fenster, das ist gut.
Es erscheint der exit-Button das ist auch gut
Klicke ich auf den exit button, verschwindet der exit- button.
Das ist insoweit gut, als etwas passiert. Bis hierher läuft das Programm also.
Aber das Fenster geht nicht zu und weitere Eingaben sind auch nicht möglich.
Jetzt hängt das Programm. Ich wollte aber auf dem Hauptbildschirm weiterarbeiten und eventuell dann einen anderen Button drücken, der ein Fenster öffnet ....

Vor allen Dingen besteht auch noch das Problem, dass, wenn das untergeordnete Fenster geöffnet ist,
und ich dann einen Klick auf das Hauptfenster mache, das zweite Fenster einfach verdeckt wird, daher
meine ursprüngliche Frage mit den übergeordneten Fenstern. Solange das zweite Fenster geöffnet ist,
sollten auch nur hier eingaben gemacht werden können. Alternative wäre, das bei einem klick auf das Hauptfenster das zweite Fenster automatisch geschlossen wird.

Code: Alles auswählen

EnableExplicit
Declare MAUSORT()
Declare Unterprog1()
Declare Unterprog2()
Enumeration
   #win1 
   #win2
   #win3
   #gdg1
   #gdg2
   #gdg3
   #gdg4
   #gdg5
EndEnumeration

Define quit,event,prognr

OpenWindow(#win1,0,0,1280,720,"Test",#PB_Window_SystemMenu |#PB_Window_MinimizeGadget |#PB_Window_ScreenCentered)            
CanvasGadget(#gdg1,0,0,1280,720,#PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
SetActiveGadget(#gdg1)         ;wichtig: Tastatur funktioniert sonst nicht
; -------
StartDrawing(CanvasOutput(#gdg1))
   Box(0,0,1280,720,RGB(0,0,0))              ; obere Leiste
   Box(2,2,1276,716,RGB(180,180,180))
   Box(1000, 20,200,60,RGB(080,080,180))   
   Box(1000,100,200,60,RGB(180,080,080))   
   
StopDrawing() 
quit=0
Repeat
   event=WindowEvent()
   Select event
      Case #PB_Event_CloseWindow
         quit=1
      Case #WM_LBUTTONDOWN
         prognr=Mausort()      
         If prognr=1:unterprog1():EndIf   
         If prognr=2:unterprog2():EndIf
   EndSelect
Until quit=1
End
; ----------------------------------------------------------
Procedure mausort()
Protected dip
dip=0
If WindowMouseX(#win1)>1000 And WindowMouseX(#win1)<1200
   If WindowMouseY(#win1)>  20 And WindowMouseY(#win1)<  80:dip=1:EndIf
   If WindowMouseY(#win1)> 100 And WindowMouseY(#win1)< 160:dip=2:EndIf
EndIf

ProcedureReturn dip
EndProcedure
; -------------------------------------------------------------------------------
Procedure unterprog1()
Protected wx,wy,event,quit
wx=WindowX(#win1)
wy=WindowY(#win1)
OpenWindow(#win2,wx+10,wy+40,1000,520,"Test2",#PB_Window_BorderLess)            
CanvasGadget(#gdg2,0,0,1000,520,#PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
SetActiveGadget(#gdg2)         ;wichtig: Tastatur funktioniert sonst nicht
StartDrawing(CanvasOutput(#gdg2))
   Box(0,0,1000,520,RGB(0,0,0))              ; obere Leiste
   Box(0,2,996,516,RGB(120,120,120))
StopDrawing() 
ButtonGadget(#gdg4,200,200,50,30,"Exit")
Repeat
   Event = WaitWindowEvent()
   If Event = #PB_Event_Gadget
   Select event
      Case #gdg4
        quit=1   
   EndSelect
   EndIf   
Until quit=1
CloseWindow(#win2)
SetActiveGadget(#gdg1)
EndProcedure
; ------------------------------------------------------------------------------------
Procedure unterprog2()
Protected wx,wy,event,quit
wx=WindowX(#win1)
wy=WindowY(#win1)
OpenWindow(#win3,wx+200,wy+60,600,220,"Test3",#PB_Window_BorderLess)            
CanvasGadget(#gdg3,0,0, 600,220,#PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
SetActiveGadget(#gdg3)         ;wichtig: Tastatur funktioniert sonst nicht
StartDrawing(CanvasOutput(#gdg3))
   Box(0,0,600,220,RGB(0,0,0))              ; obere Leiste
   Box(2,2,596,216,RGB( 70,70,70))
StopDrawing() 
ButtonGadget(#gdg5,250,120,120,80,"Exit")
Repeat
   Event = WaitWindowEvent()
   If Event = #PB_Event_Gadget
   Select event
      Case #gdg5
        quit=1   
   EndSelect
   EndIf   
Until quit=1
CloseWindow(#win3)
SetActiveGadget(#gdg1)
EndProcedure
; ----------------------------------------------------------------------------------------

Re: Mehrere Fenster (openwindow)

Verfasst: 25.01.2017 15:55
von NicTheQuick
Du arbeitest hier nicht gerade nach der Idee des CanvasGadgets. Konstanten wie "#WM_LBUTTONDOWN" gehören zur Windows-API und funktioniert auch nur unter Windows.
Außerdem hast du für jedes Fenster eine eigene Ereignisschleife, was schlecht ist, da ja zu bestimmten Zeitpunkten mehrere Fenster zur selben Zeit existieren können. Steckst du also gerade in einer anderen Ereignisschleife, werden die Ereignisse aus dem ersten Fenster schlicht ignoriert oder, wenn man es falsch macht, falsch interpretiert und es passiert etwas unvorhergesehenes.

Hast du absichtlich ein CanvasGadgets benutzt um alle Elemente deines Programmes anzuzeigen? In ein CanvasGadget kann man nur mit den 2D-Zeichenoperationen zeichnen. Buttons musst du also auch immer selbst zeichnen und ihre Funktionalität selbst nachbauen. Das Nutzen eines simplen ButtonGadgets, ComboboxGadgets, ListViewGadgets, u.a. direkt rechts neben dem CanvasGadget würde dir vermutlich viel Arbeit ersparen.

Wenn du dennoch dabei bleiben willst und alles selbst zeichnen willst, dann ist das CanvasGadget sicherlich eine gute Wahl, aber ich glaube es ist keine gute Idee für jedes Popup ein neues Fenster mit OpenWindow zu öffnen. Ich würde eher dazu raten, dieses Popup in das schon vorhandene CanvasGadget des ersten Fensters zu zeichnen und nach dem Klick auf "Exit" wieder zu löschen. Womit ich zum nächsten Punkt komme. In deinem unterprog1 erstellst du ein neues Fenster, dann ein CanvasGadget, das genau so groß ist, wie das Fenster und dann versuchst du noch einen Button mitten rein zu bauen. Das funktioniert nicht. Hier überlappt das ButtonGadget mit dem CanvasGadget. Und überlappende Gadgets funktionieren nie so wie geplant. Manche Betriebssysteme zeichnen den Button unter das Canvas (meines z.B.), andere darüber, aber ob man dann wirklich drauf klicken kann, steht immer noch in den Sternen.

Zusammenfassung:
  • Nutze möglichst nur eine Ereignisschleife, möglichst mit WaitWindowEvent(). Und falls du nicht drum herum kommst, nutze DisableWindow() um das Fenster zu deaktivieren, was zu diesem Zeitpunkt keine Ereignisse empfangen soll.
  • Überlege dir nur ein Hauptfenster zu nutzen und Popups selbst in das CanvasGadget zu zeichnen
  • Überlege, ob es nicht einfacher wäre direkt die von PB bereitgestellten Gadgets zu nutzen. Und wenn du das tust, gehe sicher, dass sie sich nicht überlappen.
  • Möchtest du dein Programm später auch auf Linux und Mac kompilieren können, dann nutze keine vordefinierten Konstanten, die mit etwas anderem als #PB_ beginnen (es gibt nur seltene Ausnahmen) und nutze keine Befehle, die mit einem Unterstrich enden (starker Hinweis auf eine betriebssystemspezifische API).

Re: Mehrere Fenster (openwindow)

Verfasst: 25.01.2017 16:41
von Diogenes
Hallo NictheQuick,

danke für Deine Antwort. Du hast Recht, mit den Gadgets kenne ich mich wirklich bisher nicht gut aus.
Meine bisherigen Spiele habe ich mit Openwindowedscreen gemacht. Siehe auch das Beispiel, welches ich im Showcase Spiele gepostet habe. Ich habe mir die Gadgets so vorgestellt, dass das im Prinzip vorgefertigte Prozeduren sind die ich auf dem Bildschirm platzieren kann und die dann abgefragt werden. Das ist aber anscheinend nicht so. Im Prinzip geht es mir hier nur darum, ein Overlay über einen Teil des Bildschirms zu legen, um darauf Informationen anzuzeigen und eine Menuabfrage zu machen. Danach soll das Overlay wieder rückstandslos verschwinden, und ich kann auf dem Hauptbildschirm weiterarbeiten.
Ich füge 'mal den bisherigen Quellcode ein. Da sind natürlich jetzt jede Menge Zeilen drin, die
für das Problem uner´heblich sind, daher habe ich ja das Kurzbeispiel geschrieben. Die einzulesenden
Bilder habe ich ausgebaut und durch einfache Boxen ersetzt. Ich denke aber man kann schon erkennen
worin ich mit meiner Frage will. Wichtig sind die beiden Buttons oben, Die Button-Leiste rechts und
der Start-Pause-Button unten. Der hier zu untersuchende Button, die anderen werden dann genauso, ist der Button Verkauf LowCost (Nr 3)

Code: Alles auswählen

; ============================================================
; Faltung schalten <F4> alle Faltungen schalten <strg><F4>
;-[-AA_INIT --------------------------------------------------
AA_INIT:
EnableExplicit
;zusätzliche Bibliothek laden
UseJPEGImageDecoder()
;UseJPEGImageEncoder()
UsePNGImageDecoder()
;} ----------------------------------------------------------
;-[-AB_Prozeduren_anmelden -----------------------------------
;Prozeduren anmelden
Declare AUTOR()
Declare MELDAUTOR()
Declare MELDUNTEN(meldu$)  
Declare MELDULOESCH()
Declare MAUSZONE()
Declare MEZU()
Declare COZU()
Declare INFO_0()
Declare INFO_1(infotafel,infomax)
Declare SYS_FARBE()
Declare SYS_BILDER()
Declare SYS_ACTION(nr,event)
Declare ZE_HIGRU() 
Declare ZE_ROHBILD()
Declare ZE_PLAYER()
Declare ZE_BUTTON(nr,tx,flp)
Declare ZE_DATUM(zeit$)
Declare ZE_SPEED()
Declare WAITACTION()
Declare CLK_OFFICE()
Declare CLK_TRADER()
Declare TR_03()
Declare CLK_PAUSTA()
Declare CLK_SPEED()
Declare RE_DATUM()
;} ----------------------------------------------------------
;-[-AC_Variablendeklarationen --------------------------------
;Variablendeklarationen
; Bilder
Enumeration
  #bld00                ; Hintergrundbild 
  #bld01                ; Weltkarte
  #bld02
  #bld03
  #bld04
  #bld05                ;  
  #bld06
  #bld07
  #bld08
  #bld09
  #bld10
 EndEnumeration
Enumeration 100 ;Button-bilder
   #but01   
   #but02   
   #but03   
   #but04
   #but05   
   #but06
   #but07   
   #but08
   #but09
   #but10
   #but11  
   #but12  
   #but13
EndEnumeration
Enumeration         ; Fonts            
   #font00 
   #font01
   #font02
   #font03
   #font04   
   #font05   
   #font06   
   #font07
   #font08
EndEnumeration
Enumeration ; Gadgets 
  #gdg00
  #gdg01
  #gdg02
  #gdg03
EndEnumeration
Enumeration 2 
   #win2
   #win3
   #win4
   #win5
EndEnumeration   

; Enumeration 100     ; Tasten
;   #kb000
; EndEnumeration
Global autor$
#TITEL$="EK-TRAMP"
#BILD00$="EK-TRAMP-00.jpg"
#BILD01$="EK-TRAMP-01.jpg"
AUTOR()

#xadd = 2               ; x-Addition (vom linken Rand bis zum ersten Klotz)
#yadd = 2               ; y-addition (vom oberen Rand bis zum ersten Klotz)
#klotz=30               ; Größe eines Spielfeldes
#win1=1                 ; ID des benutzten Fensters
#win1_x=1280            ; Fensterbreite x (0-1219) definiert
#win1_y=720             ; Fensterhöhe   y (0- 719) definiert
Global Dim gg(40)       ; globale Variablen
Global Dim fa(40)       ; Farbdefinitionen
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Global mausx,mausy,mausz,mausxalt,mausyalt
Global taste,modis,modic
Global wx,wy,winid            ;wx=Fensterbreite tatsächl; wy=Fensterhöhe tatsächl      
Global cux,cuy,cuxalt,cuyalt
Global titel$
Global timstrt,timende,startdatwert,istdatwert
; um Spielstart festzuhalten für SYS_ZEIT und ZE_ZEIT
mausx=0                 ; Maus X- Pos
mausy=0                 ; Maus y-Pos
;mausc=0                 ; Maus-Click 1=li; 2=re 
mausz=0                 ; Maus-Zone (Bildschirmbereich)
taste=0                 ; gedrückte Taste /mausclick 800+mauszone=links;900+mauszone=rechts
cux=0                   ; cursorposition x
cuy=0                   ; cursorposition y
cuxalt=0                
cuyalt=0
Define dummy,q,event,quit
Define tt$
;gg( 1)    Endeschalter 0= im Spiel 9= Abbruch durch Escape
;gg( 2)    Turnus  welcher Spieler ist gerade dran
;gg( 3)    Zustand des Fensters; 0=normal; 1=minimiert; 2=maximiert
;gg( 4)    Menuelevel 0=oberste Ebene; 1=office; 2=Ship-Trader
;gg( 5)    Pause=0/Start=1-Zustand  
;gg( 6)    Spielgeschwindigkeit (1 -10) default=5
;gg(10)    variabel verwendbar immer nur kurzfristig! 
;} -------------------------------------------------------------
;-[-AD_Schriften laden ---------------------------------------                                                   
; windows standardschriften:
; prop: Book Antiqua (serife); Arial (ohne serife) auch: Georgia, Verdana
; mono: Lucida Console ; Consolas auch: Courier New
LoadFont(#font00,"Book Antiqua",18,#PB_Font_Bold)     ; prop, meldautor, meldunten, ze_pos,ze_zeit,hover
LoadFont(#font01,"Book Antiqua",12)                   ; prop, unbenutzt
LoadFont(#font02,"Book Antiqua",24,#PB_Font_Bold)     ; prop, unbenutzt
LoadFont(#font03,"Arial",14)                          ; prop, info; Buttons
LoadFont(#font04,"Arial",12)                          ; prop, unbenutzt
LoadFont(#font05,"Arial",12,#PB_Font_Bold)            ; prop, unbenutzt      
LoadFont(#font06,"Lucida Console",12)                 ; monospace, unbenutzt      
LoadFont(#font07,"Lucida Console",12,#PB_Font_Bold)   ; monospace, unbenutzt
LoadFont(#font08,"Courier New",20,#PB_Font_Bold)   ; monospace, unbenutzt
;} ----------------------------------------------------------
;-[-AE_Hauptfenster öffnen -----------------------------------
If InitKeyboard()=0 
  MessageRequester("Fehler","Keyboard kann nicht geöffnet werden", 0)
  End
EndIf
If InitSprite()=0
  MessageRequester("Fehler","Sprite-System kann nicht geöffnet werden", 0)
  End
EndIf
If InitMouse()=0
   MessageRequester("Fehler","Maus kann nicht aktiviert werden",0)
   End
EndIf   
OpenWindow(#win1,0,0,#win1_x,#win1_y,#titel$,#PB_Window_SystemMenu |#PB_Window_MinimizeGadget |#PB_Window_ScreenCentered)            
CanvasGadget(#gdg00,0,0,#win1_x,#win1_y,#PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
SetActiveGadget(#gdg00)         ;wichtig: Tastatur funktioniert sonst nicht

; OpenWindow(#win1,0,0,#win1_x,#win1_y,#titel$,#PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
; OpenWindowedScreen(WindowID(#win1),0,0,#win1_x,#win1_y,#True,0,0)
; SetFrameRate(50)
SYS_FARBE()
SYS_BILDER()         ; Bilder initialisieren
gg(3)=0              ; Zustand Fenster 0=vorgegeben, 1=minimiert; 2=maximiert
winid=WindowID(#win1)
;} -------------------------------------------------------------
; ============================================================
;-[-BA_VORSPIEL ----------------------------------------------
BA_VORSPIEL:
ZE_HIGRU()
MELDAUTOR()
taste=0:WAITACTION()


MELDUNTEN("Information gewuenscht ? <j>/<n>")  
taste=0:WAITACTION()
MELDULOESCH()
If taste= 27:gg(1)=9 :EndIf  
If taste= 74:INFO_0():EndIf  
;} -----------------------------------------------------------
;-[-BB_ANFANG ------------------------------------------------
BB_ANFANG:
ZE_HIGRU()
MELDAUTOR()
gg(1)=0                 ; Endeschalter: im Spiel - Normalspiel
gg(4)=0                 ; Menulevel (0=alggemein); 1=office; 2=shiptrader
gg(5)=0                 ; START/PAUSEschalter: Pause=Voreinstellung
gg(6)=3                 ; SpeedSchalter: Speed=3 Voreinstellung
ZE_ROHBILD()
; Spielerarrays vor neuem Satz ausnullen
;ZE_AUSLOSUNG()             ; wer fängt an bei neuem Spiel
;ZE_BILD()                 ; Spielbild anzeigen
;ZE_ZUGNUM()                ; Zugnummer anzeigen
;ZE_CURSOR()               ; Cursor auf Startposition setzen
; MELDUNTEN("Jetzt geht's los <Taste druecken>")
; taste=0:WAITACTION()
; If taste=27:gg(1)=9:Goto DA_NACHSPIEL:EndIf  
; MELDULOESCH()
;} -----------------------------------------------------------
; ============================================================
;-[-CA_HAUPTSPIEL --------------------------------------------
CA_HAUPTSPIEL:
startdatwert=Date(1980,01,01,00,00,00)
istdatwert=startdatwert
timstrt=ElapsedMilliseconds()
timende=timstrt
event=0
Repeat
   taste=0:mausz=0
   Event=WindowEvent()
   mausx=WindowMouseX(#win1)
   mausy=WindowMouseY(#win1)
   mausz=MAUSZONE()
   If event
      SYS_ACTION(2,event)
   Else
      Delay(10)
   EndIf   
   mezu()
   ;   If taste>0 :MEZU() :EndIf
   ; COZU()
   taste=0   
   RE_DATUM()   
Until gg(1)>1

Goto DA_NACHSPIEL
;} -----------------------------------------------------------
; ============================================================
;-[-DA_NACHSPIEL ---------------------------------------------
DA_NACHSPIEL:
If gg(1)<7 : MELDUNTEN("Auf geht's. Neues Spiel - neues Glueck")
   Delay(1200)
   Goto BB_ANFANG
EndIf   
If gg(1)=7 : MELDUNTEN("SPIELENDE - <Taste druecken>") : EndIf   
If gg(1)=9 : MELDUNTEN("ABBRUCH - <Taste druecken>") : EndIf   
taste=0:WAITACTION()
If gg(1)<10
  MELDUNTEN("Neustart ? <J>/<N>")
  Delay(1200)
  taste=0:WAITACTION()
  gg(1)=0
  If taste= 74 : gg(1)=8 : EndIf  
  If taste=106 : gg(1)=8 : EndIf
  MELDULOESCH()
  If gg(1)=8 : Goto BA_VORSPIEL : EndIf  
EndIf  
ZE_HIGRU()
Delay(1000)
End
;}
; ============================================================
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure COZU()
   Meldunten("Hier ist COZU <Taste>")
   WAITACTION()
   MELDULOESCH()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MEZU()
Protected btnum,tnum,numl,scll,capl,modif,qx,dummy
Protected tm$,tt$,tx$
tm$="":tt$="":tx$=""
If taste=900         ; Rechtsclick         
   Select mausz
      Case 0
         meldunten("rechtsclick-freifeld")
      Case 1
         meldunten("rechtsclick-upscroll")
      Case 2
         meldunten("rechtsclick-rechtsscroll")
      Case 3
         meldunten("rechtsclick-downscroll")
      Case 4
         meldunten("rechtsclick-linksscroll")
      Case 5
         meldunten("rechtsclick-Zielfeld")
      Case 31
         meldunten("rechtsclick-Infofeld oben ")
      Case 32
         meldunten("rechtsclick-Infofeld mitte")
      Case 33
         meldunten("rechtsclick-Infofeld unten")
   EndSelect      
;   timstrt=ElapsedMilliseconds()
   ProcedureReturn   
EndIf   
If taste=800      ; Linksclick
   Select mausz
      Case 0
      Case 2
         CLK_OFFICE()
      Case 3
         CLK_TRADER()   
      Case 4
         CLK_PAUSTA()
      Case 5
         CLK_SPEED()   
      Case 11
         ZE_BUTTON( 1,0,1)
         Delay(120)
         ZE_BUTTON( 1,0,0)
         If gg(4)=0
            gg(1)=9        ; Quit game
         EndIf
         If gg(4)>0
            gg(4)=0
            For qx=1 To 10
               ZE_BUTTON(qx,0,0)
            Next qx
         EndIf
      Case 12
         ZE_BUTTON( 2,0,1)
         Delay(120)
         ZE_BUTTON( 2,0,0)
         If gg(4)=0:dummy=1:EndIf
         If gg(4)=1:dummy=2:EndIf
         If gg(4)=2:dummy=3:EndIf
      Case 13
         ZE_BUTTON( 3,0,1)
         Delay(120)
         ZE_BUTTON( 3,0,0)
         If gg(4)=0:dummy=1:EndIf
         If gg(4)=1:dummy=2:EndIf
         If gg(4)=2:TR_03():EndIf
      Case 14
         ZE_BUTTON( 4,0,1)
         Delay(120)
         ZE_BUTTON( 4,0,0)
         If gg(4)=0:dummy=1:EndIf
         If gg(4)=1:dummy=2:EndIf
         If gg(4)=2:dummy=3:EndIf
      Case 15
         ZE_BUTTON( 5,0,1)
         Delay(120)
         ZE_BUTTON( 5,0,0)
         If gg(4)=0:dummy=1:EndIf
         If gg(4)=1:dummy=2:EndIf
         If gg(4)=2:dummy=3:EndIf
      Case 16
         ZE_BUTTON( 6,0,1)
         Delay(120)
         ZE_BUTTON( 6,0,0)
         If gg(4)=0:dummy=1:EndIf
         If gg(4)=1:dummy=2:EndIf
         If gg(4)=2:dummy=3:EndIf
      Case 17
         ZE_BUTTON( 7,0,1)
         Delay(120)
         ZE_BUTTON( 7,0,0)
         If gg(4)=0:dummy=1:EndIf
         If gg(4)=1:dummy=2:EndIf
         If gg(4)=2:dummy=3:EndIf
      Case 18
         ZE_BUTTON( 8,0,1)
         Delay(120)
         ZE_BUTTON( 8,0,0)
         If gg(4)=0:dummy=1:EndIf
         If gg(4)=1:dummy=2:EndIf
         If gg(4)=2:dummy=3:EndIf
      Case 19
         ZE_BUTTON( 9,0,1)
         Delay(120)
         ZE_BUTTON( 9,0,0)
         If gg(4)=0:dummy=1:EndIf
         If gg(4)=1:dummy=2:EndIf
         If gg(4)=2:dummy=3:EndIf
      Case 20
         ZE_BUTTON(10,0,1)
         Delay(120)
         ZE_BUTTON(10,0,0)
         If gg(4)=0:dummy=1:EndIf
         If gg(4)=1:dummy=2:EndIf
         If gg(4)=2:dummy=3:EndIf
      Default
         meldunten("linksclick-freifeld")
   EndSelect      
   ProcedureReturn   
EndIf
modif=modis+modic
Select modif
   Case 1000
      tm$="<L-Shift>"
   Case 1300
      tm$="<R-Shift>"
   Case 2000
      tm$="<L-ctrl>"
   Case 2400
      tm$="<R-ctrl>"
   Case 3000
      tm$="<L-shift><L-ctrl>"
   Case 3300
      tm$="<R-shift><L-ctrl>"
   Case 3400
      tm$="<L-shift><R-ctrl>"
   Case 3700
      tm$="<R-shift><R-ctrl>"
   Default
      tm$="<"+Str(modif)+">"
EndSelect
If taste
   tt$="<"+Str(taste)+">"
   If taste= 8:tt$="<backspace>":EndIf
   If taste= 9:tt$="<tab>":EndIf
   If taste=13:tt$="<enter>":EndIf
   If taste=27:tt$="<ESC>":EndIf
   If taste=32:tt$="<space>":EndIf
   If taste>47 And taste<91
      tt$="<"+Chr(taste)+">"
   EndIf      
   If taste=144
      numl=GetKeyState_(#VK_NUMLOCK) & 1
      If numl=0:tt$="<Numlock off>":EndIf
      If numl=1:tt$="<Numlock on >":EndIf
   EndIf      
   If taste=145
      scll=GetKeyState_(#VK_SCROLL) & 1
      If scll=0:tt$="<Scrollock off>":EndIf
      If scll=1:tt$="<Scrollock on >":EndIf
   EndIf      
   If taste=20
      capl=GetKeyState_(#VK_CAPITAL) & 1
      If capl=0:tt$="<Capslock off>":EndIf
      If capl=1:tt$="<Capslock on >":EndIf
   EndIf      
   ; problem: Shift + ctrl + Mausclick muss noch abgefangen werden
   tx$=tm$+TT$
   meldunten(tx$)
EndIf   
;ELDULOESCH()
mausz=0:taste=0:modif=0
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure SYS_ACTION(nr,event)
Select event
   Case #PB_Event_CloseWindow
      gg(1)=9:taste=27
   Case  #PB_Event_MinimizeWindow
      gg(3)=1
   Case #PB_Event_MaximizeWindow  
      gg(3)=2
      wy=WindowHeight(#win1)
      wx=WindowWidth(#win1)
   Case #PB_Event_RestoreWindow
      gg(3)=0   
      wy=#win1_y
      wx=#win1_x
   Case #WM_LBUTTONDOWN
      taste=800
   Case #WM_RBUTTONDOWN
      taste=900
   Case #WM_KEYDOWN
      If EventwParam()=16
         modis=1000
         If EventlParam()>3000000
            modis=1300
         EndIf
      EndIf     
      If EventwParam()=17
         modic=2000
         If EventlParam()>3000000
            modic=2400
         EndIf
      EndIf     
   Case #WM_KEYUP
      taste=EventwParam()
EndSelect
If taste=27:gg(1)=9:EndIf
If taste=16:modis=0:taste=0:EndIf
If taste=17:modic=0:taste=0:EndIf
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure WAITACTION()
Protected event
Repeat
   Event = WindowEvent()
   If event
      SYS_ACTION(1,event)
   Else
      Delay(5)
   EndIf   
Until taste>0   
Delay(120)

EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure RE_DATUM()
Protected timdiff,adsek,faktor,tag,tagalt,timneu
Protected zeit$,wota$
timende=ElapsedMilliseconds()
If gg(5)=1:timdiff=timende-timstrt:EndIf
timstrt=timende

Select gg(6)
   Case 1
      faktor= 36
   Case 2
      faktor= 72
   Case 3
      faktor=108 
   Case 4
      faktor=144
   Case 5
      faktor=180
   Case 6
      faktor=216
   Case 7
      faktor=252
   Case 8
      faktor=288
   Case 9
      faktor=324
   Case 10
      faktor=360
EndSelect

adsek=timdiff*faktor
istdatwert+adsek
tag=DayOfWeek(istdatwert)
Select tag
   Case 0
      wota$="So, "
   Case 1
      wota$="Mo, "
   Case 2
      wota$="Di, "
   Case 3
      wota$="Mi, "
   Case 4
      wota$="Do, "
   Case 5
      wota$="Fr, "
   Case 6
      wota$="Sa, "
EndSelect
zeit$=wota$+FormatDate("%dd.%mm.%yyyy",istdatwert)


; Debug"---"
; Debug tag
; Debug gg(7)
; 
; If tag>gg(7)
;    meldunten(Str(timende-timneu))
;    timneu=ElapsedMilliseconds()
;    gg(7)=tag
; EndIf   
; Debug"---"
; 
; Debug timende
; Debug timdiff
; Debug adsek
; Debug istdatwert
; Debug tag
; Debug gg(7)
; Debug zeit$
; Debug"======"
If gg(5)=1:ZE_DATUM(zeit$):EndIf

EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure CLK_OFFICE()
Protected qx
StartDrawing(CanvasOutput(#gdg00))
   DrawImage(ImageID(#but08),1040,1)      
StopDrawing()
Delay(120)
StartDrawing(CanvasOutput(#gdg00))
  DrawImage(ImageID(#but07),1040,1)      
StopDrawing()
gg(4)=1
For qx=1 To 10
  ZE_BUTTON(qx,0,0)
Next qx 
meldunten("Officeclick"):Delay(1000):melduloesch()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure CLK_TRADER()
Protected qx
StartDrawing(CanvasOutput(#gdg00))
   DrawImage(ImageID(#but10),800,1)      
StopDrawing()
Delay(120)
StartDrawing(CanvasOutput(#gdg00))
  DrawImage(ImageID(#but09),800,1)      
StopDrawing()
gg(4)=2
For qx=1 To 10
  ZE_BUTTON(qx,0,0)
Next qx 
meldunten("CLK_TRADER("):Delay(1000):melduloesch()

EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure CLK_PAUSTA()
StartDrawing(CanvasOutput(#gdg00))
   DrawImage(ImageID(#but13),1040,645)   
StopDrawing()
Delay(120)
If gg(5)=0
   StartDrawing(CanvasOutput(#gdg00))
      DrawImage(ImageID(#but12),1040,645)   
   StopDrawing()
EndIf
If gg(5)=1
   StartDrawing(CanvasOutput(#gdg00))
      DrawImage(ImageID(#but11),1040,645)   
   StopDrawing()
   timstrt=ElapsedMilliseconds()
EndIf
gg(5)*(-1)+1
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure CLK_SPEED()
If mausx>252:gg(6)= 1:EndIf
If mausx>262:gg(6)= 2:EndIf
If mausx>272:gg(6)= 3:EndIf
If mausx>282:gg(6)= 4:EndIf
If mausx>292:gg(6)= 5:EndIf
If mausx>302:gg(6)= 6:EndIf
If mausx>312:gg(6)= 7:EndIf
If mausx>322:gg(6)= 8:EndIf
If mausx>332:gg(6)= 9:EndIf
If mausx>342:gg(6)=10:EndIf
ZE_SPEED()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_SPEED()
Protected li,ob,br,ho,qx,qz,brg,brk,frb
li= 240
ob= 644
br= 120
ho=  44
StartDrawing(CanvasOutput(#gdg00))
   Box(li  ,ob  ,br,ho  ,fa(4))
   Box(li,ob+1,br-1,ho-1,fa(8))
;  StopDrawing()
   brg=10           ; gesamtbreite eines Blocks in Hintergrundfarbe
   brk=7           ; Breite des schwazen/gelben Teils des Blocks
   li=242             
   ob=652
   ho=26
   ; StartDrawing(CanvasOutput(#gdg00))
   For qz=1 To 10
      qx=li+qz*brg
      frb=fa(6)
      If qz>gg(6):frb=fa(4):EndIf
      Box(qx,ob,brk,ho,frb)
   Next qz
StopDrawing()

EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TR_03()
Protected li,ob,br,ho,quit,event

li=WindowX(#win1)+10
ob=WindowY(#win1)+50
br=1000
ho=550

OpenWindow(#win2,li,ob,br,ho,"Trader_3",#PB_Window_BorderLess) 
; CanvasGadget(#gdg01,0,0,br,ho,#PB_Canvas_ClipMouse|#PB_Canvas_Keyboard|#PB_Canvas_Border)
; SetGadgetColor(#gdg01,#PB_Gadget_BackColor,fa(27))
; SetActiveGadget(#gdg01)         ;wichtig: Tastatur funktioniert sonst nicht
ButtonGadget(#gdg03,li+850,ob+400,100,30,"Exit")
; ButtonGadget(8, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit")

SetGadgetState(#gdg03,0) 

quit=0
 Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      Select EventGadget()
         Case #gdg03 ; Quit...
            quit=1
      EndSelect
    EndIf
Until quit=1
CloseWindow(#win2)
SetActiveGadget(#gdg00)         ;wichtig: Tastatur funktioniert sonst nicht


















EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MELDAUTOR()
StartDrawing(CanvasOutput(#gdg00))
   Box (   0,688,1280,32,fa(4))
   Box (   1,689, 238,30,fa(2)) 
   Box ( 240,689, 800,30,fa(2))
   Box (1041,689, 238,30,fa(2))
   DrawingFont(FontID(#font00))
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(  15,689,#titel$,fa(4))
   DrawText(  14,688,#titel$,fa(6))
   DrawText(1055,689,autor$ ,fa(4))
   DrawText(1054,688,autor$ ,fa(6))
StopDrawing()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MELDUNTEN(meldu$)
Protected txend,abzug   
StartDrawing(CanvasOutput(#gdg00))
   Box (240,689,800,30,fa(1))
   DrawingFont(FontID(#font00))
   DrawingMode(#PB_2DDrawing_Transparent)
   txend=DrawText(245,690,meldu$,fa(1))
   abzug=(txend-245)/2
   DrawText(640-abzug,691,meldu$,fa(4))
   DrawText(640-abzug,690,meldu$,fa(6))
StopDrawing()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MELDULOESCH()
StartDrawing(CanvasOutput(#gdg00))
   Box (240,689,800,30,fa(2))
StopDrawing()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure INFO_0()
Protected infoende,infotafel,infomax,quit   
infoende=0
infotafel=1
infomax=1
ZE_HIGRU()
MELDAUTOR()
Repeat
  INFO_1(infotafel,infomax)
  taste=0:WAITACTION()
  Select taste
    Case 27        
      quit=1
    Case 37
      infotafel=infotafel-1
    Case 39
      infotafel=infotafel+1
  EndSelect  
  If infotafel=0 : infotafel=infomax : EndIf
  If infotafel>infomax : infotafel=1 : EndIf  
Until quit=1  
ZE_HIGRU()
MELDAUTOR()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure INFO_1(infotafel,infomax)
Protected q,info$,dx,dy   
Select infotafel
   Case 1             
      Restore ZB_INFO
   Case 2
      Restore ZC_INFO
   Case 3
      Restore ZD_INFO
   Case 4
      Restore ZE_INFO
EndSelect
StartDrawing(CanvasOutput(#gdg00))
   Box (0,0,#win1_x,#win1_y-32,fa(8))
StopDrawing()
; FlipBuffers()
If infomax=1:MELDUNTEN("Zum Beenden: <esc> druecken")        :EndIf  
If infomax>1:MELDUNTEN("Beenden <esc> ; Blaettern <re> <li>"):EndIf
StartDrawing(CanvasOutput(#gdg00))
   DrawingFont(FontID(#font03))
   DrawingMode(#PB_2DDrawing_Transparent)
   For q=1 To 26
      Read.s info$  
      dx=25:dy=q*25-5
      DrawText(dx,dy,info$,fa(10))
   Next q  
StopDrawing() 
; FlipBuffers()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure AUTOR()
Protected v1,v2,v3,na0$,na2$,na4$   
V1=40:V2=65:V3=110
NA0$=Chr((V2-25)) +Chr((v3-11)) +Chr((V1+1))   +Chr((V2-33))  +Chr((V1+29))
NA2$=Chr((V2+10)) +Chr((3*v1-3))+Chr((V3-9))   +Chr((2*V1+24))+Chr((v3))
NA4$=Chr((3*V1-6))+Chr((V3-5))  +Chr((2*V1+19))+Chr((2*V2-26))+Chr((V2-v1+7))
autor$=NA0$+NA4$+NA2$
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure SYS_FARBE()
Fa( 1)= RGB(185,015,000)      ; rot für meldunten
Fa( 2)= RGB(090,100,010)      ; olivgruen f. meldautor
Fa( 3)= RGB(030,030,180)      ; mittelblau als Hintergrund f. Meldtast
Fa( 4)= RGB(000,000,000)      ; schwarz
Fa( 5)= RGB(255,255,255)      ; hellweiss
Fa( 6)= RGB(255,255,000)      ; gelb
Fa( 7)= RGB(255,000,000)      ; rot
Fa( 8)= RGB(080,080,080)      ; grau
Fa( 9)= RGB(165,005,000)      ; farbe 2 für meldunten
Fa(10)= RGB(180,180,200)      ; .
Fa(11)= RGB(180,180,180)      ; Button  1   
Fa(12)= RGB(030,030,030)      ; Button  2  
Fa(13)= RGB(150,150,200)      ; Button  3    
Fa(14)= RGB(030,030,080)      ; Button  4  
Fa(15)= RGB(240,200,200)      ; Button  5   
Fa(16)= RGB(060,030,030)      ; Button  6   
Fa(17)= RGB(180,030,030)      ; Button  7   
Fa(18)= RGB(055,005,005)      ; Button  8   
Fa(19)= RGB(030,030,180)      ; Button  9
Fa(20)= RGB(005,005,055)      ; Button 10
; ab hier frei programmierbare Farben für spezifisches Prog
Fa(21)= RGB(000,000,100)      ; dunkelblau
Fa(22)= RGB(060,130,060)      ; gruen   
Fa(23)= RGB(005,070,005)      ; dunkelgruen
Fa(24)= RGB(075,060,000)      ; braun
Fa(25)= RGB(130,120,000)      ; beige
Fa(26)= RGB(100,150,240)      ; hellblau
Fa(27)= RGB(250,040,040)      ; hellrot 
Fa(28)= RGB(140,010,010)      ; dunkelrot
Fa(29)= RGB(030,030,030)      ; dunkelgrau
Fa(30)= RGB(250,250,250)      ; hellweiss
Fa(31)= RGB(100,250,100)      ; knatschgruen
Fa(32)= RGB(250,040,040)      ; frei
Fa(33)= RGB(250,040,040)      ; frei 
Fa(34)= RGB(140,010,010)      ; frei 
Fa(35)= RGB(180,180,180)      ; hellgrau; Menu
Fa(36)= RGB(140,140,140)      ; mittelgrau Menu
Fa(37)= RGB(160,180,200)      ; hellgrau mit blau; Untermneues
Fa(38)= RGB(120,140,160)      ; mittelgrau mit blau; Untermenues

  EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure SYS_BILDER()
; jetzt soll das Hintergrundbild geladen werden 
; ---
; hier wird das Bild aus der EXE ausgelesen, in die es integriert ist
;CatchImage(#bld00,?zz_BILD01)
;CatchImage(#bld01,?zz_BILD02)
CreateImage(#bld00,1280,720)
StartDrawing(ImageOutput(#bld00))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(12)):BackColor (fa(11))        ; hell oben  grau
   LinearGradient(40,1,40,720)
   Box(0,0,1280,720,fa(4))
StopDrawing()
CreateImage(#bld01,1200,600)
StartDrawing(ImageOutput(#bld01))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(12)):BackColor (fa(11))        ; hell oben  grau
   LinearGradient(40,1,40,720)
   Box(0,0,1280,720,fa(4))
StopDrawing()

; ---
; hier wird das Bild von der HDD geladen
; #bld00=LoadImage(#PB_Any,HBILD$)
; ---
; bilder erstellen für meldunten und meldtast
; GrabImage(#bld00,#bld05, 0, 688, 1000, 32) ;meldunten 
; GrabImage(#bld00,#bld02, 0, 672, 1024, 32) ;meldtast
; ----------------------------------------
;jetzt werden die Button-Bilder erzeugt mit Farbverlauf
; ----------------------------------------
CreateImage(#but01,80,60)                       ; Button-Leiste 1 (F1)
StartDrawing(ImageOutput(#but01))
   Box(0,0,80,60,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(12)):BackColor (fa(11))        ; hell oben  grau
   LinearGradient(40,1,40,60)
   Box(1,1,78,59)
StopDrawing()

CreateImage(#but02,80,60)                       ; Button-Leiste 2 (F1)
StartDrawing(ImageOutput(#but02))
   ;Farbbox dunkel oben; hell unten   
   Box(0,0,80,60,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(11)):BackColor (fa(12))        ; hell unten grau
   LinearGradient(40,1,40,60)
   Box(1,1,78,59)
StopDrawing()
; ---
CreateImage(#but03,80,60)                       ;Button-Leiste 1 (F2)
StartDrawing(ImageOutput(#but03))
   Box(0,0,80,60,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(14)):BackColor (fa(13))        ; hell oben blau      
   LinearGradient(40,1,40,60)
   Box(1,1,78,59)
StopDrawing()
CreateImage(#but04,80,60)                       ; Button-Leiste 2 (F2)
StartDrawing(ImageOutput(#but04))
   Box(0,0,80,60,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(13)):BackColor (fa(14))        ;hell unten blau
   LinearGradient(40,1,40,60)
   Box(1,1,78,59)
StopDrawing()
; ---
CreateImage(#but05,80,60)                       ; Button-Leiste 1 (F3)
StartDrawing(ImageOutput(#but05))
   Box(0,0,80,60,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(16)):BackColor (fa(15))        ; hell oben rot
   LinearGradient(40,1,40,60)
   Box(1,1,78,59)
StopDrawing()
CreateImage(#but06,80,60)                       ; Button-Leiste 2 (F3)
StartDrawing(ImageOutput(#but06))
   Box(0,0,80,60,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(15)):BackColor (fa(16))        ; hell unten rot
   LinearGradient(40,1,40,60)
   Box(1,1,78,59)
StopDrawing()
; ---  grosse Buttons oben
CreateImage(#but07,240,44)                   ;OfficeButton 1
StartDrawing(ImageOutput(#but07))
   Box(0,0,240,44,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(20)):BackColor(fa(19))      ; hell oben
   LinearGradient(40,1,40,44)
   Box(1,0,238,43)
   DrawingFont(FontID(#font00))
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(85,8,"Office",fa(6))
StopDrawing()

CreateImage(#but08,240,44)                   ; OfficeButton 2
StartDrawing(ImageOutput(#but08))
   Box(0,0,240,44,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(19)):BackColor(fa(20))      ; hell unten
   LinearGradient(40,1,40,44)
   Box(1,0,238,43)
   DrawingFont(FontID(#font00))
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(85,8,"Office",fa(6))
StopDrawing()

CreateImage(#but09,240,44)                   ; Ship-Trader-Button 1
StartDrawing(ImageOutput(#but09))
   Box(0,0,240,44,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(18)):BackColor(fa(17))      ;hell oben
   LinearGradient(40,1,40,44)
   Box(1,0,238,43)
   DrawingFont(FontID(#font00))
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(65,8,"Ship-Trader",fa(6))
StopDrawing()

CreateImage(#but10,240,44)                   ; Ship-Trader-Button 2
StartDrawing(ImageOutput(#but10))
   Box(0,0,240,44,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(17)):BackColor(fa(18))      ;hell unten
   LinearGradient(40,1,40,44)
   Box(1,0,238,43)
   DrawingFont(FontID(#font00))
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(65,8,"Ship-Trader",fa(6))
StopDrawing()
; ---
; Start-Pause-Button unten
CreateImage(#but11,240,44)                   ; Start-Pause-Button 1
StartDrawing(ImageOutput(#but11))
   Box(0,0,240,44,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(18)):BackColor(fa(17))      ; hell oben
   LinearGradient(40,1,40,44)
   Box(1,0,238,43)
   DrawingFont(FontID(#font00))
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(65,8,"START",fa(6))
StopDrawing()

CreateImage(#but12,240,44)                   ; Start-Pause-Button 2
StartDrawing(ImageOutput(#but12))
   Box(0,0,240,44,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(22)):BackColor(fa(23))      ; hell unten
   LinearGradient(40,1,40,44)
   Box(1,0,238,43)
   DrawingFont(FontID(#font00))
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(65,8,"PAUSE",fa(6))
StopDrawing()

CreateImage(#but13,240,44)                   ; Start-Pause-Button 3
StartDrawing(ImageOutput(#but13))
   Box(0,0,240,44,fa(4))
   DrawingMode(#PB_2DDrawing_Gradient) 
   FrontColor(fa(12)):BackColor(fa(11))      ;hell unten grau
   LinearGradient(40,1,40,44)
   Box(1,0,238,43)
StopDrawing()
; ---
   
   
   
   
   
; ------------------------------------------------------------
; Sprite für Mauscursor erzeugen
; ------------------------------------------------------------
; CreateSprite(99,6,6)
; StartDrawing(SpriteOutput(99))
;    Box(0,0,5,5,fa(6))
; StopDrawing()
; ------------------------------------------------------------

EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_HIGRU()
StartDrawing(CanvasOutput(#gdg00))
;   DrawingMode(#PB_2DDrawing_Default) 
   DrawImage(ImageID(#bld00),0,0)
StopDrawing()
; FlipBuffers()   
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_ROHBILD()
; anzeige des kompletten spielbildes am Anfang
;einzelne Bereiche jeweils als eigene Prozedur wie die Buttons
; hier dann nur aufruf der Prozeduren   
Protected li,ob,br,ho,qx

StartDrawing(CanvasOutput(#gdg00))
   DrawImage(ImageID(#bld01),0,44)
StopDrawing()
StartDrawing(CanvasOutput(#gdg00))
   Box(0,0,1280,44,fa(4))              ; obere Leiste
   Box(1,1,1278,43,fa(35))
   LineXY(0,44,0,644,fa(4))
   Box(0,644,1280,44,fa(4))            ; untere Leiste
   Box(1,645,1278,43,fa(35))
   li=1200:ho= 60
   ; Hamburg (001)
   li=(600-1)+32
   ob=(44+300-1)-177
   Box(li,ob,3,3,fa(1)) 
   ; Vigo (002)
   li=(600-1)-27
   ob=(44+300-1)-140
   Box(li,ob,3,3,fa(1))
   ; new York (003)
   li=(600-1)-247
   ob=(44+300-1)-134
   Box(li,ob,3,3,fa(1))
StopDrawing()
   For qx=1 To 10
      ZE_BUTTON(qx,0,0)
   Next qx 
StartDrawing(CanvasOutput(#gdg00))
   li= 800:ob=  1:DrawImage(ImageID(#but09),li,ob)  ; Button Shiptrader    
   li=1040:ob=  1:DrawImage(ImageID(#but07),li,ob)  ; Button Office    
   li=1040:ob=645:DrawImage(ImageID(#but11),li,ob)  ; Button Start/Pause 
StopDrawing()
ZE_DATUM("  , --.--.----")
ZE_SPEED()


; data.i   1,631,166,
; data.i   2,572,203,
; data.i   3,352,209,
; data.s "1","Hamburg","Deutschland"
; data.s "2","Vigo","Portugal"
; data.s "3","New York","USA"
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_BUTTON(nr,tx,flp)
Protected li,ob,ta$,tb$,bld,num
If gg(4)=0
   num=nr
   If flp=0:bld=#but01:EndIf
   If flp=1:bld=#but02:EndIf
EndIf   
If gg(4)=1
   num=nr+10
   If flp=0:bld=#but03:EndIf
   If flp=1:bld=#but04:EndIf
EndIf   
If gg(4)=2
   num=nr+20
   If flp=0:bld=#but05:EndIf
   If flp=1:bld=#but06:EndIf
EndIf   
Select num
   ; ---  allgemein   
   Case 1
      ta$="Quit ":tb$="Game  "   
   Case 2     
      ta$="Spei-" :tb$="chern"     
   Case 3     
      ta$="Laden" :tb$="     "     
   Case 4     
      ta$="allg4" :tb$="     "     
   Case 5
      ta$="allg5" :tb$="     "
   Case 6
      ta$="allg6" :tb$="     "
   Case 7
      ta$="allg7" :tb$="     "
   Case 8   
      ta$="allg8" :tb$="     "   
   Case 9
      ta$="allg9" :tb$="     "
   Case 10
      ta$="allg0" :tb$="     "
   ; ---  Office 
   Case 11
      ta$="Exit " :tb$="     "   
   Case 12
      ta$="offc2 ":tb$="     "
   Case 13
      ta$="offc3 ":tb$="     "
   Case 14
      ta$="offc4 ":tb$="     "
   Case 15
      ta$="offc5 ":tb$="     "
   Case 16
      ta$="offc6 ":tb$="     "
   Case 17
      ta$="offc7 ":tb$="     "
   Case 18
      ta$="offc8 ":tb$="     "
   Case 19
      ta$="offc9 ":tb$="     "
   Case 20
      ta$="offc0 ":tb$="     "
   ; ---  Ship-Trader 
   Case 21
      ta$="Exit  " :tb$="     "   
   Case 22
      ta$="Ankauf" :tb$="     "   
   Case 23
      ta$="Verkauf" :tb$="LowCost"   
   Case 24
      ta$="Verkauf" :tb$="Preowned"   
   Case 25
      ta$="Verkauf" :tb$="Schüttgut"   
   Case 26
      ta$="Verkauf" :tb$="Tanker"   
   Case 27
      ta$="Verkauf" :tb$="Container"   
   Case 28
      ta$="Verkauf" :tb$="Sonstige"   
   Case 29
      ta$="Verkauf" :tb$="Ausrüstg"   
   Case 30
      ta$="   .  " :tb$="    .   "   
   Default
      ta$="  .  " :tb$="     "     
EndSelect      
li=1200
ob=(nr-1)*60+44  
StartDrawing(CanvasOutput(#gdg00))
   DrawImage(ImageID(bld),li,ob)
   DrawingFont(FontID(#font03))
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(li+2,ob+ 2,ta$,fa(6))
   DrawText(li+2,ob+30,tb$,fa(6))
StopDrawing()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_DATUM(zeit$)
; Spieldauer anzeigen
Protected li,ob,br,ho
li=   0
ob= 644
br= 240
ho=  44
StartDrawing(CanvasOutput(#gdg00))
   Box(li  ,ob  ,br,ho  ,fa(4))
   Box(li+1,ob+1,br-2,ho-1,fa(8))
   DrawingFont(FontID(#font08))
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(li+8,ob+6,zeit$,fa(4))
   DrawText(li+9,ob+7,zeit$,fa(6))
StopDrawing()
; FlipBuffers()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MAUSZONE()
Protected mf
mf=0
; Spielfeld mit Scrollzonen
If mausy<45
   If mausx> 800:mf=3:EndIf   
   If mausx>1040:mf=2:EndIf   
   ProcedureReturn mf   
EndIf   
If mausy>644 And mausy<689
   If mausx>1040 :mf=4:EndIf   
   If mausx> 240 And mausx<480:mf=5:EndIf  
   ProcedureReturn mf   
EndIf   
If mausx>1200
   If mausy> 44:mf=11:EndIf
   If mausy>104:mf=12:EndIf
   If mausy>164:mf=13:EndIf
   If mausy>224:mf=14:EndIf
   If mausy>284:mf=15:EndIf
   If mausy>344:mf=16:EndIf
   If mausy>404:mf=17:EndIf
   If mausy>464:mf=18:EndIf
   If mausy>524:mf=19:EndIf
   If mausy>584:mf=20:EndIf
   ProcedureReturn mf   
EndIf
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ============================================================
; ------Datasections------------------------------------------
;-[-ZA_BILDER ------------------------------------------------
; das Hintergrundbild wird in die exe integriert
DataSection
zz_BILD01:
;IncludeBinary #BILD00$
zz_BILD02: 
;IncludeBinary #BILD01$
;IncludeBinary "EK-KARTE.png"
EndDataSection
;}-------------------------------------------------------------
;-[-ZB_INFO --------------------------------------------------
DataSection
ZB_INFO:  
Data.s "Hinweise:"
Data.s ".z02"
Data.s ".z03"
Data.s ".z04"
Data.s ".z05"
Data.s ".z06"
Data.s ".z07"
Data.s ".z08"
Data.s ".z09"
Data.s ".z10"
Data.s ".z11"
Data.s ".z12"
Data.s ".z13"
Data.s ".z14"
Data.s ".z15"
Data.s ".z16"
Data.s ".z17"
Data.s ".z18"
Data.s ".z19"
Data.s ".z20"
Data.s ".z21"
Data.s ".z22"
Data.s ".z23"
Data.s ".z24"
Data.s ".z25"
Data.s ".z26"
EndDataSection
;} -----------------------------------------------------------
;-[-ZC_INFO --------------------------------------------------
DataSection
ZC_INFO:
EndDataSection
;} -----------------------------------------------------------
;-[-ZD_INFO --------------------------------------------------
DataSection
ZD_INFO:
EndDataSection
;} ------------------------------------------------------------
;-[-ZE_INFO --------------------------------------------------
DataSection
ZE_INFO:
EndDataSection
;} ------------------------------------------------------------
;-[-ZF_KARTEN ------------------------------------------------
DataSection
ZF_KARTEN:
Data.i 1,1,1,1,1,1,1,1,1,1
Data.i 2,2,2,2,2,2,2,2,2,2
Data.i 3,3,3,3,3,3,3,3,3,3
Data.i 4,4,4,4,4,4,4,4,4,4,4,4
Data.i 5,5,5,5
Data.i 6,6,6,6,6,6,6,6,6,6,6,6,6,6
Data.i 7,7,7,7,7
Data.i 8,9,9,9,9,9,9,10,10,10,10
Data.i 11,12,12,12,12,12,12,13,13,13
Data.i 14,15,15,15,15,15,15,16,16,16
Data.i 17,18,18,18,18,18,18,19,19,19
Data.i 0,0,0,0,0,0,0,0,0
EndDataSection
;} ------------------------------------------------------------------
; ============================================================
End

Re: Mehrere Fenster (openwindow)

Verfasst: 25.01.2017 22:51
von Diogenes
Hallo,

ich glaube, ich habe jetzt eine Lösung gefunden.
Ich kehre zurück zum openwindowedscreen und mache alle
Operationen auf dem einen screen.
Jedenfalls funktioniert der folgende Code so wie er soll.

Frage: Gibt es eine Möglichkeit über createimage einen Teil des Screens
quasi abzufotografieren, damit man hinterher den screen wiederherstellen kann ?

Code: Alles auswählen

EnableExplicit
Declare MAUSORT()
Declare Unterprog1()
Declare Unterprog2()
Declare ENDUPROG()
Enumeration
   #win1 
   #win2
   #win3
   #gdg1
   #gdg2
   #gdg3
   #gdg4
   #gdg5
EndEnumeration

Define quit,event,prognr
InitKeyboard()
InitSprite()
InitMouse()

OpenWindow(#win1,0,0,1280,720,"Test",#PB_Window_SystemMenu |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#win1),0,0,1280,720,#True,0,0)
SetFrameRate(50)

; -------
; 1. Bild
StartDrawing(ScreenOutput())
;StartDrawing(CanvasOutput(#gdg1))
   Box(0,0,1280,720,RGB(0,0,0))              ; obere Leiste
   Box(2,2,1276,716,RGB(180,180,180))
   Box(1000, 20,200,60,RGB(080,080,180))   
   Box(1000,100,200,60,RGB(180,080,080))   
StopDrawing()
FlipBuffers()   

;Schleife:

quit=0
Repeat
   event=WindowEvent()
   Select event
      Case #PB_Event_CloseWindow
         quit=1
      Case #WM_LBUTTONDOWN
         prognr=Mausort()      
         If prognr=1:unterprog1():EndIf   
         If prognr=2:unterprog2():EndIf
      Case #PB_Event_Gadget 
         If EventGadget()=#gdg4:ENDUPROG():EndIf
   EndSelect
Until quit=1
End
; -----------------------------------------------------------------------

Procedure mausort()
Protected dip
dip=0
If WindowMouseX(#win1)>1000 And WindowMouseX(#win1)<1200
   If WindowMouseY(#win1)>  20 And WindowMouseY(#win1)<  80:dip=1:EndIf
   If WindowMouseY(#win1)> 100 And WindowMouseY(#win1)< 160:dip=2:EndIf
EndIf

ProcedureReturn dip
EndProcedure
; -----------------------------------------------------------------------

Procedure unterprog1()
Protected wx,wy,event,quit
StartDrawing(ScreenOutput())
   Box(0,0,800,400,RGB(  0,  0,  0))   
   Box(2,2,796,396,RGB(120,120,120))
StopDrawing()
FlipBuffers()   
ButtonGadget(#gdg4,200,200,50,30,"Exit")

EndProcedure
; -----------------------------------------------------------------------

Procedure unterprog2()
Protected wx,wy,event,quit
StartDrawing(ScreenOutput())
   Box(0,0,600,220,RGB(0,0,0))         
   Box(2,2,596,216,RGB( 70,70,70))
StopDrawing()
FlipBuffers()
ButtonGadget(#gdg4,250,120,120,80,"Exit")
 
EndProcedure
; -----------------------------------------------------------------------
Procedure Enduprog()

HideGadget(#gdg4,1)
StartDrawing(ScreenOutput())
   Box(0,0,1280,720,RGB(0,0,0))         
   Box(2,2,1276,716,RGB(180,180,180))
   Box(1000, 20,200,60,RGB(080,080,180))   
   Box(1000,100,200,60,RGB(180,080,080))   
StopDrawing()
FlipBuffers()

EndProcedure
; -----------------------------------------------------------------------


Re: Mehrere Fenster (openwindow)

Verfasst: 25.01.2017 23:07
von Bisonte
F1 - Hilfe hat geschrieben:Syntax

Ergebnis = GrabDrawingImage(#Image, x, y, Breite, Höhe)

Beschreibung

Erstellt ein neues Bild (englisch "Image) mit dem Inhalt des angegebenen Bereichs in der aktuellen Ausgabe.