Seite 1 von 4

Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 13.06.2014 20:10
von Diogenes
Hallo,

nachdem ich mit Eurer Hilfe ja mein Programmgerüst erstellt habe und
auch ein altes Programm nach PB portieren konnte, kommt jetzt das nächste Problem.
Um den alten Thread nicht zu weit ausufern zu lassen habe ich einen Neuen aufgemacht.
Folgendes Problem: Das Programm Spacejump, welches ich im letzten Thread portiert habe,
benutzt als Grafikelemente einfache Boxen. Das ist ja recht schmucklos.
Darkbasic bietet beim Boxkommando an, die vier Ecken verschieden einzufärben und die Box dann
mit den Farbverläufen zwischen den Ecken zu füllen. Dadurch kann man schon coole Effekte
erzielen und die Box sieht nicht so langweilig aus.
PB bietet diese Möglichkeit nicht.
Also habe ich mich daran gegeben, eine Funktion zu schreiben, welche das bewerkstelligt.
Dazu habe ich einfach das Beispiel aus der Hilfe zum PB 2D-Drawing genommen und umgeschrieben.
Die zu erzielenden Effekte sind toll, wenn auch nicht die, die ich erwartet hatte.
Da müssen wir eventuell anschließend drüber diskutieren.
Problem: wenn ich eine Vatiable ändern wollte, musste ich das ganze Programm immer wieder neu
kompilieren.
Also wollte ich mir eine Benutzersteuerung basteln, in der ich die Werte während des Programmes
verändern kann und dann das Bild neu zeichnen lassen kann.
Dabei bin ich dann wieder über die Gadgets und deren Anwendung gestolpert, die ich bisher
so nicht kannte. Kann mir bitte jemand helfen, wie ich das String-Gadget ausgelesen bekomme.
Das Button-Gadget funktioniert glaube ich, zumindest sagt mir debug, das das Gadget aufgerufen wird.
Das war jetzt wiedere 'ne Menge Text, aber ich wollte Euch mein Problem möglichst exakt schildern.

Code: Alles auswählen


Global Dim fabox(200,200,3)
Global Dim gg(40)
Declare BERECHNUNG()
Declare AUSGABE()
Declare NEUZEICH()
; ---------------------------------------------------------
   ; ---------------------------------------
 ; Eingaben
  ; ---------------------------------------
  ;links oben  r g b 
  gg( 1)=000 : gg( 2)=000 : gg( 3)=000
  ;rechts oben  r g b 
  gg( 4)=000 : gg( 5)=000 : gg( 6)=000
  ;links unten  r g b 
  gg( 7)=000 : gg( 8)=200 : gg( 9)=000
  ;rechts unten  r g b 
  gg(10)=000 : gg(11)=000 : gg(12)=000
  gg(13) = 80   ; Divisor
  gg(14) = 50   ;groesse des kleinen Bildes
  gg(15) =  1   ; linke  Seite: Absolut oder nicht
  gg(16) =  1   ; rechte Seite: Absolut oder nicht
  gg(17) =  0   ; x-achse Differenz absolut oder nciht  
  gg(18) =  0   ; flip Horizontal
  gg(19) =  0   ; flip vertikal
;------------------------------------------------------------

OpenWindow(0, 0, 0, 400, 450, "FILLBOX", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateImage(0,202,202)   
CreateImage(1,202,202)
CopyImage(0, 1)
;gg(14)=44:ResizeImage(1,gg(14),gg(14))
;           (Nr, x,   y,Breite, Höhe;Inhalt$; Flag)         
  StringGadget( 0, 260,  10, 80, 20, "Li ob rot", #PB_String_Numeric)
  StringGadget( 1, 260,  35, 80, 20, "Li ob grn", #PB_String_Numeric)
  StringGadget( 2, 260,  60, 80, 20, "Li ob bla", #PB_String_Numeric)
  StringGadget( 3, 260,  85, 80, 20, "Re ob rot", #PB_String_Numeric)
  StringGadget( 4, 260, 110, 80, 20, "Re ob grn", #PB_String_Numeric)
  StringGadget( 5, 260, 135, 80, 20, "Re ob bla", #PB_String_Numeric)
  StringGadget( 6, 260, 160, 80, 20, "Li un rot", #PB_String_Numeric)
  StringGadget( 7, 260, 185, 80, 20, "Li un grn", #PB_String_Numeric)
  StringGadget( 8, 260, 210, 80, 20, "Li un bla", #PB_String_Numeric)
  StringGadget( 9, 260, 235, 80, 20, "Re un rot", #PB_String_Numeric)
  StringGadget(10, 260, 260, 80, 20, "Re un grn", #PB_String_Numeric)
  StringGadget(11, 260, 285, 80, 20, "Re un bla", #PB_String_Numeric)
  StringGadget(12, 260, 310, 80, 20, "Divisor  ", #PB_String_Numeric)
  StringGadget(13, 260, 335, 80, 20, "Resize Groesse ", #PB_String_Numeric)
  
  TextGadget(20,350, 13,80,20,Str(gg(1)))
  TextGadget(21,350, 38,80,20,Str(gg(2)))
  TextGadget(22,350, 63,80,20,Str(gg(3)))
  TextGadget(23,350, 88,80,20,Str(gg(4)))
  TextGadget(24,350,113,80,20,Str(gg(5)))
  TextGadget(25,350,138,80,20,Str(gg(6)))
  TextGadget(26,350,163,80,20,Str(gg(7)))
  TextGadget(27,350,188,80,20,Str(gg(8)))
  TextGadget(28,350,213,80,20,Str(gg(9)))
  TextGadget(29,350,238,80,20,Str(gg(4)))
  TextGadget(30,350,263,80,20,Str(gg(5)))
  TextGadget(31,350,288,80,20,Str(gg(6)))
  TextGadget(32,350,313,80,20,Str(gg(13)))
  TextGadget(33,350,338,80,20,Str(gg(14)))
  
  ButtonGadget(34,260,380,80,20,"Neu Zeichnen",#PB_Button_Toggle)
  
  ; erstes Mal darstellen
  ; BERECHNUNG()
  AUSGABE() 
  NEUZEICH()
  quit=0
  ; -------Hauptschleife ------------
  Repeat
     Event = WaitWindowEvent()
     If event=#PB_Event_CloseWindow:quit=1:EndIf
     If event= #PB_Event_Gadget
        num=EventGadget()
        dipneu=0
        Select num
          Case 0    
            If EVENTType= #PB_EventType_Change   
              gg(1)=Val(GetGadgetText( 0))
              If gg(1)>255:gg(1)=255:EndIf
              If gg(1)<  0:gg(1)=  0:EndIf
              TextGadget(20,350, 13,80,20,Str(gg(1)))
              dipneu=1  
            EndIf
          Case 1  
            If EVENTType= #PB_EventType_Change   
              gg(2)=Val(GetGadgetText( 1))
              If gg(2)>255:gg(2)=255:EndIf
              If gg(2)<  0:gg(2)=  0:EndIf
              TextGadget(21,350, 38,80,20,Str(gg(2)))
              Debug eventtype
              Debug GetGadgetText( 1)
              Debug gg(2)
              dipneu=1
            EndIf
          Case 2        
            If EVENTType= #PB_EventType_Change   
              gg(3)=Val(GetGadgetText( 2))
              If gg(3)>255:gg(3)=255:EndIf
              If gg(3)<  0:gg(3)=  0:EndIf
              TextGadget(22,350, 63,80,20,Str(gg(3)))
              dipneu=1
            EndIf
          Case 3  
            If EVENTType= #PB_EventType_Change   
              gg(4)=Val(GetGadgetText( 3))
              If gg(4)>255:gg(4)=255:EndIf
              If gg(4)<  0:gg(4)=  0:EndIf
              TextGadget(23,350, 88,80,20,Str(gg(4)))
              dipneu=1
            EndIf
          Case 4  
            If EVENTType= #PB_EventType_Change   
              gg(5)=Val(GetGadgetText( 4))
              If gg(5)>255:gg(5)=255:EndIf
              If gg(5)<  0:gg(5)=  0:EndIf
              TextGadget(24,350,113,80,20,Str(gg(5)))
              dipneu=1
            EndIf
          Case 5 
            If EVENTType= #PB_EventType_Change   
              gg(6)=Val(GetGadgetText( 5))
              If gg(6)>255:gg(6)=255:EndIf
              If gg(6)<  0:gg(6)=  0:EndIf
              TextGadget(25,350,138,80,20,Str(gg(6)))
              dipneu=1
            EndIf
          Case 6
            If EVENTType= #PB_EventType_Change   
              gg(7)=Val(GetGadgetText( 6))
              If gg(7)>255:gg(7)=255:EndIf
              If gg(7)<  0:gg(7)=  0:EndIf
              TextGadget(26,350,163,80,20,Str(gg(7)))
              dipneu=1
            EndIf
          Case 7
            If EVENTType= #PB_EventType_Change   
              gg(8)=Val(GetGadgetText( 7))
              If gg(8)>255:gg(8)=255:EndIf
              If gg(8)<  0:gg(8)=  0:EndIf
              TextGadget(27,350,188,80,20,Str(gg(8)))
              dipneu=1
            EndIf
          Case 8  
            If EVENTType= #PB_EventType_Change   
              gg(9)=Val(GetGadgetText( 8))
              If gg(9)>255:gg(9)=255:EndIf
              If gg(9)<  0:gg(9)=  0:EndIf
              TextGadget(28,350,213,80,20,Str(gg(9)))
              dipneu=1
            EndIf
          Case 9
            If EVENTType= #PB_EventType_Change   
              gg(10)=Val(GetGadgetText( 9))
              If gg(10)>255:gg(10)=255:EndIf
              If gg(10)<  0:gg(10)=  0:EndIf
              TextGadget(29,350,238,80,20,Str(gg(4)))
              dipneu=1
            EndIf
          Case 10 
            If EVENTType= #PB_EventType_Change   
              gg(11)=Val(GetGadgetText(10))
              If gg(11)>255:gg(11)=255:EndIf
              If gg(11)<  0:gg(11)=  0:EndIf
              TextGadget(30,350,263,80,20,Str(gg(5)))
              dipneu=1
            EndIf
          Case 11  
            If EVENTType= #PB_EventType_Change   
              gg(12)=Val(GetGadgetText(11))
              If gg(12)>255:gg(12)=255:EndIf
              If gg(12)<  0:gg(12)=  0:EndIf
              TextGadget(31,350,288,80,20,Str(gg(6)))
              dipneu=1
            EndIf
          Case 12
            If EVENTType= #PB_EventType_Change   
              gg(13) =Val(GetGadgetText(12))
              If gg(13)>200:  gg(13)=200:EndIf
              If gg(13)<  0:  gg(13)=  1:EndIf
              TextGadget(32,350,313,80,20,Str(gg(13))) 
              dipneu=1
            EndIf
          Case 13
            If EVENTType= #PB_EventType_Change   
              gg(14)=Val(GetGadgetText(13))
              If gg(14)>200:gg(14)=200:EndIf
              If gg(14)<  0:gg(14)= 20:EndIf
              TextGadget(33,350,338,80,20,Str(gg(14)))
              dipneu=1
            EndIf
          Case 34  
            dip=GetGadgetState(34)
            Debug dip
            If dip=1
              NEUZEICH()
              SetGadgetState(34,0)
            EndIf
        EndSelect          
     EndIf
     If dipneu=1     
        gg(15) = 1   ; linke  Seite: Absolut oder nicht
        gg(16) = 1   ; rechte Seite: Absolut oder nicht
        gg(17) = 0   ; x-achse Differenz absolut oder nicht 
        gg(18) = 1   ; flip Horizontal
        gg(19) = 0   ; flip vertikal
        BERECHNUNG()
        AUSGABE()  
      EndIf
      
Until quit=1
End

; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  Procedure BERECHNUNG()
  ; ---------------------------------------
  ; Berechnungen
  ; ---------------------------------------
  liob=RGB(gg( 1),gg( 2),gg( 3))
  reob=RGB(gg( 4),gg( 5),gg( 6))
  liun=RGB(gg( 7),gg( 8),gg( 9))
  reun=RGB(gg(10),gg(11),gg(12))
  
  For qy=1 To 200
    ; linke Seite Differenz Linksoben - linksunten evtl negativ
    If gg(15)=0
      lidifr=gg(1)-gg(7)  
      lidifg=gg(2)-gg(8)
      lidifb=gg(3)-gg(9)
    EndIf
    ; linke Seite Differenz Linksoben - Linksunten Absolutwert
    If gg(15)=1
      lidifr=Abs(gg(1)-gg(7))  
      lidifg=Abs(gg(2)-gg(8))
      lidifb=Abs(gg(3)-gg(9))
    EndIf
    ;berechnen des Punktes auf der y-Achse ( Linksdiffernz/ Divisor*yStrecke
    lifar=gg(1)+(Int(lidifr/gg(13))*(qy-1))
    lifag=gg(3)+(Int(lidifg/gg(13))*(qy-1))
    lifab=gg(2)+(Int(lidifb/gg(13))*(qy-1))
    ;---
    ; rechte Seite Differenz Linksoben - linksunten evtl negativ
    If gg(16)=0
      redifr=gg(4)-gg(10)
      redifg=gg(5)-gg(11)
      redifb=gg(6)-gg(12)
    EndIf
    ; rechte Seite Differenz Linksoben - Linksunten Absolutwert
    If gg(16)=1
      redifr=Abs(gg(4)-gg(10))
      redifg=Abs(gg(5)-gg(11))
      redifb=Abs(gg(6)-gg(12))
    EndIf  
    ;berechnen des Punktes auf der y-Achse ( rechtsdiffernz/ Divisor*yStrecke
    refar=gg(4)+(Int(Redifr/gg(13))*(qy-1))
    refag=gg(5)+(Int(Redifg/gg(13))*(qy-1))
    refab=gg(6)+(Int(Redifb/gg(13))*(qy-1))
    ; 
    For qx=1 To 200
        ; X-Achse Differenz links und rechts evtl negativ
        If gg(17)=0
          fabox(qx,qy,1)=lifar+(Int(((lifar-refar)/gg(13))*(qx-1)))
          fabox(qx,qy,2)=lifag+(Int(((lifag-refag)/gg(13))*(qx-1)))
          fabox(qx,qy,3)=lifab+(Int(((lifab-refab)/gg(13))*(qx-1)))
        EndIf   
        ; x-achse Differenz links und rechts absolut
        If gg(17)=1
          If lifar<refar : fabox(qx,qy,1)=fabox(qx,qy,1)*(-1) : EndIf
          If lifag<refag : fabox(qx,qy,2)=fabox(qx,qy,2)*(-1) : EndIf
          If lifab<refab : fabox(qx,qy,3)=fabox(qx,qy,3)*(-1) : EndIf
        EndIf   
    Next qx
  Next qy
  ; flip horizontal gg(17)=1
  If gg(18)=1
    For qy=1 To 200
      For qx=1 To 100
        Swap fabox(qx,qy,1), fabox(201-qx,qy,1)    
        Swap fabox(qx,qy,2), fabox(201-qx,qy,2)    
        Swap fabox(qx,qy,3), fabox(201-qx,qy,3)    
      Next qx
    Next qy  
  EndIf
  ; flip vertikal gg(18) =1
  If gg(19)=1
    For qy=1 To 100
      For qx=1 To 200
        Swap fabox(qx,qy,1), fabox(qx,201-qy,1)    
        Swap fabox(qx,qy,2), fabox(qx,201-qy,2)    
        Swap fabox(qx,qy,3), fabox(qx,201-qy,3)    
      Next qx
    Next qy  
  EndIf  
  EndProcedure
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  Procedure AUSGABE()
  StartDrawing(ImageOutput(0))
    For qy= 1 To 200
      For qx= 1 To 200
        farbe=RGB(fabox(qx,qy,1),fabox(qx,qy,2),fabox(qx,qy,3))
        Plot (qx,qy,farbe)
      Next qx
    Next qy  
    ;Box(1,1,10,10,liob)
    ;Box(191,1,10,10,reob)
    ;Box(1,191,10,10,liun)
    ;Box(191,191,10,10,reun)
  StopDrawing() 
    ;
    ; ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  CopyImage(0, 1)
  ResizeImage(1,gg(14),gg(14))
  ; FLIPHO(1,2)
  EndProcedure
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 Procedure NEUZEICH()
 StartDrawing(WindowOutput(0))
      DrawImage(ImageID(0), 10, 10)
      DrawImage(ImageID(1), 10,250)
 StopDrawing()    
 EndProcedure   
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 



Re: Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 13.06.2014 20:52
von mk-soft
Für jedes Gadget gibt es in der Hilfe eine Beschreibung mit den erforderlichen Funktion.
Bei StringGadget zum Beispiel SetGadgetText und GetGadgetText.

Beim Aufbau von Dialogen sollte man folgende Reihenfolge beachten.

1. Fenster aufbauen
2. Werte setzen. Standardwerte oder gespeicherte Werte.
3. Bei beenden des Dialog die Werte bei Ok oder Übernehmen auslesen und speichern.

Für Einstellungen nehme ich gerne Strukturen.

Werden mal ein Beispiel für ein Dialog Einstellungen erstellen.

Re: Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 13.06.2014 22:08
von matbal
@Diogenes

GetGadgetText() liest den Text aus, das ist richtig.

Was du vergessen hast, ist, den EventType zu ermitteln. Du benutzt zwar EVENTType. Das ist, so wie du es anwendest, eine Variable. Die wird aber nie gesetzt und ist daher immer Null, und deshalb wird GetGadgetText() auch nie aufgerufen.

Entweder machst du aus der Variablen einen Funktionsaufruf, indem du noch die fehlenden Klammern anhängst, dann funktioniert es.
Oder du weist der Variablen den Eventtype vorher zu.

Re: Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 13.06.2014 22:22
von NicTheQuick
EnableExplicit *hust* :wink:

Re: Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 13.06.2014 22:33
von Diogenes
@Matbal

Danke, das war's, ich hab' den Code mind.
100 mal gelesen, ich habe es aber um's Verrecken nicht
gesehen.

Re: Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 14.06.2014 11:53
von ts-soft
Mit EnableExplicit hättest den Code wahrscheinlich nur einmal gelesen :wink:

Re: Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 14.06.2014 12:15
von Diogenes
Hallo,

@ NicTheQuick & ts-soft

Touché ! <)

Ich werde versuchen, es mir anzugewöhnen, auf der anderen Seite muss ich sagen,
daß ich durch die Sachen mit den Gadgets noch nicht 100%ig durchblicke, da
muss ich mich langsam rantasten; deshalb schreibe ich ja auch in
der Anfänger-Sektion :wink:

viele Grüße
und Danke

ich melde mich wieder

Diogenes

Re: Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 14.06.2014 20:33
von Rebon
Diogenes hat geschrieben:Ich werde versuchen, es mir anzugewöhnen, auf der anderen Seite muss ich sagen,
daß ich durch die Sachen mit den Gadgets noch nicht 100%ig durchblicke, da
muss ich mich langsam rantasten; deshalb schreibe ich ja auch in
der Anfänger-Sektion :wink:
Ich blicke als reiner Hobbyprogrammierer, der nicht täglich mehrere Stunden vor dem Rechner sitzen will, auch bei ganz vielen Dingen nicht durch.

Gerade deshalb ist EnableExplicit für mich eine große Hilfe, wenn es nicht gerade um ein paar Zeilen Testcode geht. Aber ich gebe zu dass es am Anfang nerven kann, trotzdem ist es bei einem längerem Programmcode immer ein Vorteil und nie ein Nachteil diese Compiler Direktive zu aktivieren. :wink:

Re: Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 15.06.2014 15:08
von Diogenes
Hallo,

ich benötige noch einmal Eure Hilfe.
Ich bin immer noch dabei, meine Farbverläufe in einer Box
hinzubekommen. Ich gebe ja zu, daß das weitgehend sinnfrei ist,
aber ich habe mich nun mal daran festgebissen. Außerdem habe ich
dadurch schon den Umgang mit string- text- und Button-Gagdgets
gelernt. Ist ja auch schon was.
Mein Problem liegt in den letzten 30 Zeilen des angefügten Codes.
Alles funktioniert einwandfrei bis ich den Resizebefehl
in der Funktion Neuzeich(), der jetzt deaktiviert ist, ausführen will.
Das macht Kollege Compi aus puer Bosheit nicht. aber warum nicht ?

Code: Alles auswählen

Global Dim fabox(200,200,3)
Global Dim gg(40)
Declare BERECHNUNG()
Declare NEUZEICH()
Declare GESTALTUNG()
; ---------------------------------------------------------
; ---------------------------------------
; Vorgaben
; ---------------------------------------
;links oben  r g b 
gg( 1)=000 : gg( 2)=200 : gg( 3)=000
;rechts oben  r g b 
gg( 4)=000 : gg( 5)=000 : gg( 6)=000
;links unten  r g b 
gg( 7)=000 : gg( 8)=000 : gg( 9)=000
;rechts unten  r g b 
gg(10)=000 : gg(11)=000 : gg(12)=000
gg(13) = 80   ; Divisor
gg(14) = 50   ; groesse des kleinen Bildes x
gg(15) = 50   ; groesse des kleinen Bildes y
gg(16) = 1234 ; Reihenfolge der Bilder Uhrzeigersinn liob
gg(17) =  0   ; dip: linke  Seite: Absolut oder nicht
gg(18) =  0   ; dip: rechte Seite: Absolut oder nicht
gg(19) =  0   ; dip: x-achse Differenz absolut oder nicht  
gg(20) =  4   ; kleines Bild links  oben   normal (4)
gg(21) =  5   ; kleines Bild rechts oben   normal (5)
gg(22) =  6   ; kleines Bild rechts unten  normal (6)
gg(23) =  7   ; kleines Bild links  unten  normal (7)
gg(24) =  0   ; welche bIlder sollen verkleinert werden
              ; 0= alle vier; 1=nur oben links; 2=oL+or; 3=lo+lu
gg(25) =200   ; x-größe des zu grabbenden und dann zu verkleinernden bildes              
gg(26) =200   ; y-größe des zu grabbenden und dann zu verkleinernden bildes
; ------------------------------------------------------------

OpenWindow(0, 0, 0, 450, 660, "FILLBOX", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateImage(0,200,200)   
CreateImage(1,200,200)
CreateImage(2,200,200)
CreateImage(3,200,200)
; --
CreateImage(4,50,50)
CreateImage(5,50,50)
CreateImage(6,50,50)
CreateImage(7,50,50)
; --
CreateImage(8,200,200)
CreateImage(9,200,200)

CopyImage(0, 1)
CopyImage(0, 2)
CopyImage(0, 3)

;           (Nr, x,   y,Breite, Höhe;Inhalt$; Flag)         
StringGadget( 0, 260,  10, 80, 20,Str(gg( 1)), #PB_String_Numeric)
StringGadget( 1, 260,  35, 80, 20,Str(gg( 2)), #PB_String_Numeric)
StringGadget( 2, 260,  60, 80, 20,Str(gg( 3)), #PB_String_Numeric)
StringGadget( 3, 260,  85, 80, 20,Str(gg( 4)), #PB_String_Numeric)
StringGadget( 4, 260, 110, 80, 20,Str(gg( 5)), #PB_String_Numeric)
StringGadget( 5, 260, 135, 80, 20,Str(gg( 6)), #PB_String_Numeric)
StringGadget( 6, 260, 160, 80, 20,Str(gg( 7)), #PB_String_Numeric)
StringGadget( 7, 260, 185, 80, 20,Str(gg( 8)), #PB_String_Numeric)
StringGadget( 8, 260, 210, 80, 20,Str(gg( 9)), #PB_String_Numeric)
StringGadget( 9, 260, 235, 80, 20,Str(gg(10)), #PB_String_Numeric)
StringGadget(10, 260, 260, 80, 20,Str(gg(11)), #PB_String_Numeric)
StringGadget(11, 260, 285, 80, 20,Str(gg(12)), #PB_String_Numeric)
StringGadget(12, 260, 310, 80, 20,Str(gg(13)), #PB_String_Numeric)
StringGadget(13, 260, 335, 80, 20,Str(gg(14)), #PB_String_Numeric)
StringGadget(14, 260, 360, 80, 20,Str(gg(15)), #PB_String_Numeric)
StringGadget(15, 260, 385, 80, 20,Str(gg(16)), #PB_String_Numeric)
StringGadget(16, 260, 410, 80, 20,Str(gg(24)), #PB_String_Numeric)
  


TextGadget(17,350, 13,80,20,"Li ob rot")
TextGadget(18,350, 38,80,20,"Li ob grn")
TextGadget(19,350, 63,80,20,"Li ob bla")
TextGadget(20,350, 88,80,20,"Re ob rot")
TextGadget(21,350,113,80,20,"Re ob grn")
TextGadget(22,350,138,80,20,"Re ob bla")
TextGadget(23,350,163,80,20,"Li un rot")
TextGadget(24,350,188,80,20,"Li un grn")
TextGadget(25,350,213,80,20,"Li un bla")
TextGadget(26,350,238,80,20,"Re un rot")
TextGadget(27,350,263,80,20,"Re un grn")
TextGadget(28,350,288,80,20,"Re un bla")
TextGadget(29,350,313,80,20,"Divisor  ")
TextGadget(30,350,338,80,20,"Resize x ")
TextGadget(31,350,363,80,20,"Resize y ")
TextGadget(32,350,388,80,20,"Reihenfolge")
TextGadget(39,350,410,80,20,"Grabben")
TextGadget(33,350,435,80,20,Str(gg(17)))
TextGadget(34,350,460,80,20,Str(gg(18)))
TextGadget(35,350,485,80,20,Str(gg(19)))


ButtonGadget(36,260,435,80,20,"Y-li abs",#PB_Button_Toggle)
ButtonGadget(37,260,460,80,20,"Y-re abs",#PB_Button_Toggle)
ButtonGadget(38,260,485,80,20,"X-ob abs",#PB_Button_Toggle)


ButtonGadget(40,260,510,80,20,"Neu Zeichnen",#PB_Button_Toggle)
  
; erstes Mal darstellen
BERECHNUNG()
NEUZEICH()
; Delay(20000)
quit=0
; -------Hauptschleife ------------
  Repeat
     Event = WaitWindowEvent()
     If event=#PB_Event_CloseWindow:quit=1:EndIf
     If event= #PB_Event_Gadget
        num=EventGadget()
        dipneu=0
        Select num
          Case 0    
            If EventType()= #PB_EventType_Change   
              ;links oben rot
              gg(1)=Val(GetGadgetText( 0))
              If gg(1)>255:gg(1)=255:SetGadgetText(0,Str(gg(1))):EndIf
              If gg(1)<  0:gg(1)=  0:SetGadgetText(0,Str(gg(1))):EndIf
              dipneu=1  
            EndIf
          Case 1  
            If EventType()= #PB_EventType_Change   
              ;links oben gruen
              gg(2)=Val(GetGadgetText( 1))
              If gg(2)>255:gg(2)=255:SetGadgetText(1,Str(gg(2))):EndIf
              If gg(2)<  0:gg(2)=  0:SetGadgetText(1,Str(gg(2))):EndIf
              dipneu=1
            EndIf
          Case 2        
            ;links oben blau
            If EventType()= #PB_EventType_Change   
              gg(3)=Val(GetGadgetText( 2))
              If gg(3)>255:gg(3)=255:SetGadgetText(2,Str(gg(3))):EndIf
              If gg(3)<  0:gg(3)=  0:SetGadgetText(2,Str(gg(3))):EndIf
              dipneu=1
            EndIf
          Case 3  
            ;rechts oben rot
            If EventType()= #PB_EventType_Change   
              gg(4)=Val(GetGadgetText( 3))
              If gg(4)>255:gg(4)=255:SetGadgetText(3,Str(gg(4))):EndIf
              If gg(4)<  0:gg(4)=  0:SetGadgetText(3,Str(gg(4))):EndIf
              dipneu=1
            EndIf
          Case 4  
            ;rechts oben gruen
            If EventType()= #PB_EventType_Change   
              gg(5)=Val(GetGadgetText( 4))
              If gg(5)>255:gg(5)=255:SetGadgetText(4,Str(gg(5))):EndIf
              If gg(5)<  0:gg(5)=  0:SetGadgetText(4,Str(gg(5))):EndIf
              dipneu=1
            EndIf
          Case 5 
            ;rechts oben blau
            If EventType()= #PB_EventType_Change   
              gg(6)=Val(GetGadgetText( 5))
              If gg(6)>255:gg(6)=255:SetGadgetText(5,Str(gg(6))):EndIf
              If gg(6)<  0:gg(6)=  0:SetGadgetText(5,Str(gg(6))):EndIf
              dipneu=1
            EndIf
          Case 6
            If EventType()= #PB_EventType_Change   
              ; links unten rot
              gg(7)=Val(GetGadgetText( 6))
              If gg(7)>255:gg(7)=255:SetGadgetText(6,Str(gg(7))):EndIf
              If gg(7)<  0:gg(7)=  0:SetGadgetText(6,Str(gg(7))):EndIf
              dipneu=1
            EndIf
          Case 7
            If EventType()= #PB_EventType_Change   
              ; links unten gruen
              gg(8)=Val(GetGadgetText( 7))
              If gg(8)>255:gg(8)=255:SetGadgetText(7,Str(gg(8))):EndIf
              If gg(8)<  0:gg(8)=  0:SetGadgetText(7,Str(gg(8))):EndIf
              dipneu=1
            EndIf
          Case 8  
            If EventType()= #PB_EventType_Change   
              ; links unten blau
              gg(9)=Val(GetGadgetText( 8))
              If gg(9)>255:gg(9)=255:SetGadgetText(8,Str(gg(9))):EndIf
              If gg(9)<  0:gg(9)=  0:SetGadgetText(8,Str(gg(9))):EndIf
              dipneu=1
            EndIf
          Case 9
            If EventType()= #PB_EventType_Change   
              ; rechts unten rot
              gg(10)=Val(GetGadgetText( 9))
              If gg(10)>255:gg(10)=255:SetGadgetText(9,Str(gg(10))):EndIf
              If gg(10)<  0:gg(10)=  0:SetGadgetText(9,Str(gg(10))):EndIf
              dipneu=1
            EndIf
          Case 10 
            If EventType()= #PB_EventType_Change   
              ; rechts unten gruen
              gg(11)=Val(GetGadgetText(10))
              If gg(11)>255:gg(11)=255:SetGadgetText(10,Str(gg(11))):EndIf
              If gg(11)<  0:gg(11)=  0:SetGadgetText(10,Str(gg(11))):EndIf
              dipneu=1
            EndIf
          Case 11  
            If EventType()= #PB_EventType_Change   
              ;rechts unten blau
              gg(12)=Val(GetGadgetText(11))
              If gg(12)>255:gg(12)=255:SetGadgetText(11,Str(gg(12))):EndIf
              If gg(12)<  0:gg(12)=  0:SetGadgetText(11,Str(gg(12))):EndIf
              dipneu=1
            EndIf
          Case 12
            If EventType()= #PB_EventType_Change   
              ; Divisor
              gg(13) =Val(GetGadgetText(12))
              If gg(13)>999:  gg(13)=200:SetGadgetText(12,Str(gg(13))):EndIf
              If gg(13)<  0:  gg(13)=  1:SetGadgetText(12,Str(gg(13))):EndIf
              dipneu=1
            EndIf
          Case 13
            If EventType()= #PB_EventType_Change   
              ; x- groesse kleines Bild
              gg(14)=Val(GetGadgetText(13))
              If gg(14)>200:gg(14)=200:SetGadgetText(13,Str(gg(14))):EndIf
              If gg(14)<  0:gg(14)= 20:SetGadgetText(13,Str(gg(14))):EndIf
              dipneu=1
            EndIf
          Case 14
            If EventType()= #PB_EventType_Change   
              ; y-groesse kleines Bild
              gg(15)=Val(GetGadgetText(14))
              If gg(15)>200:gg(15)=200:SetGadgetText(14,Str(gg(15))):EndIf
              If gg(15)<  0:gg(15)= 20:SetGadgetText(14,Str(gg(15))):EndIf
              dipneu=1
            EndIf
          Case 15
            If EventType()= #PB_EventType_Change   
              ; reihenfolge der 4 kleinen Bilder im Uhrzeigersinn L o => L u
              aa$=GetGadgetText(15)
              a1=Val(Mid(aa$,1,1))
              a2=Val(Mid(aa$,2,1))
              a3=Val(Mid(aa$,3,1))
              a4=Val(Mid(aa$,4,1))
              If a1<0 : a1=1 : EndIf
              If a1>4 : a1=4 : EndIf
              If a2<0 : a2=1 : EndIf
              If a2>4 : a2=4 : EndIf
              If a3<0 : a3=1 : EndIf
              If a3>4 : a3=4 : EndIf
              If a4<0 : a4=1 : EndIf
              If a4>4 : a4=4 : EndIf
              gg(16)=a1*1000+a2*100+a3*10+a4
              gg(20)=a1+3
              gg(21)=a2+3
              gg(22)=a3+3
              gg(23)=a4+3
              dipneu=1
            EndIf
          Case 16
            If EventType()= #PB_EventType_Change   
              ; welche Bilder sollen gegrabbt werden für resize
              gg(24)=Val(GetGadgetText(16))
              If gg(24)>3:gg(24)=3:SetGadgetText(16,Str(gg(24))):EndIf
              If gg(24)<0:gg(24)=0:SetGadgetText(16,Str(gg(24))):EndIf
              dipneu=2
            EndIf
          Case 36  
            dip=GetGadgetState(36)
            gg(17)=dip
            TextGadget(33,350,435,80,20,Str(gg(17)))
            dipneu=1
          Case 37  
            dip=GetGadgetState(37)
            gg(18)=dip
            TextGadget(34,350,460,80,20,Str(gg(18)))
            dipneu=1  
          Case 38  
            dip=GetGadgetState(38)
            gg(19)=dip
            TextGadget(35,350,485,80,20,Str(gg(19)))
            dipneu=1  
          Case 40  
            dip=GetGadgetState(40)
            If dip=1
              SetGadgetText(15,Str(gg(16)))
              ;BERECHNUNG()
              NEUZEICH()
              SetGadgetState(40,0)
            EndIf
        EndSelect          
     EndIf
     If dipneu=1     
       BERECHNUNG()
     EndIf
     If dipneu=2
       BERECHNUNG()
       GESTALTUNG()
     EndIf
Until quit=1
End

; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  Procedure BERECHNUNG()
  ; ---------------------------------------
  ; Berechnungen
  ; ---------------------------------------
  liob=RGB(gg( 1),gg( 2),gg( 3))
  reob=RGB(gg( 4),gg( 5),gg( 6))
  liun=RGB(gg( 7),gg( 8),gg( 9))
  reun=RGB(gg(10),gg(11),gg(12))
  For qy=0 To 199
    ; linke Seite Differenz Linksoben - linksunten evtl negativ
    If gg(17)=0
      lidifr=gg(1)-gg(7)  
      lidifg=gg(2)-gg(8)
      lidifb=gg(3)-gg(9)
    EndIf
    ; linke Seite Differenz Linksoben - Linksunten Absolutwert
    If gg(17)=1
      lidifr=Abs(gg(1)-gg(7))  
      lidifg=Abs(gg(2)-gg(8))
      lidifb=Abs(gg(3)-gg(9))
    EndIf
;     If gg(17)=1
;       lidifr=gg(1)-gg(7)  
;       lidifg=gg(2)-gg(8)
;       lidifb=gg(3)-gg(9)
;       If lidifr<0 :lidifr=lidifr*(-1):EndIf
;       If lidifg<0 :lidifg=lidifg*(-1):EndIf
;       If lidifb<0 :lidifb=lidifb*(-1):EndIf
;         
;     EndIf
;berechnen des Punktes auf der y-Achse ( Linksdiffernz/ Divisor*yStrecke
    lifar=gg(1)+(Int(lidifr/gg(13))*qy)
    lifag=gg(2)+(Int(lidifg/gg(13))*qy)
    lifab=gg(3)+(Int(lidifb/gg(13))*qy)
    ; ---
    ; rechte Seite Differenz Linksoben - linksunten evtl negativ
    If gg(18)=0
      redifr=gg(4)-gg(10)
      redifg=gg(5)-gg(11)
      redifb=gg(6)-gg(12)
    EndIf
    ; rechte Seite Differenz Linksoben - Linksunten Absolutwert
    If gg(18)=1
      redifr=Abs(gg(4)-gg(10))
      redifg=Abs(gg(5)-gg(11))
      redifb=Abs(gg(6)-gg(12))
    EndIf  
    ;berechnen des Punktes auf der y-Achse ( rechtsdiffernz/ Divisor*yStrecke
    refar=gg(4)+(Int(Redifr/gg(13))*qy)
    refag=gg(5)+(Int(Redifg/gg(13))*qy)
    refab=gg(6)+(Int(Redifb/gg(13))*qy)
    ; 
    
    ; berechnen der Differenz zwischen rechts und links
;    If gg(19)=0
      diffro=lifar-refar
      diffgr=lifag-refag
      diffbl=lifab-refab
;   EndIf
;     If gg(19)=1
;       diffro=Abs(lifar-refar)
;       diffgr=Abs(lifag-refag)
;       diffbl=Abs(lifab-refab)
;     EndIf
;     For qx=0 To 199
;       fabox(qx,qy,1)=lifar+(Int(diffro/gg(13)))*qx
;       fabox(qx,qy,2)=lifag+(Int(diffgr/gg(13)))*qx
;       fabox(qx,qy,3)=lifab+(Int(diffbl/gg(13)))*qx
;     Next qx  
    
    
    For qx=0 To 199
        ; X-Achse Differenz links und rechts evtl negativ
        If gg(19)=0
          fabox(qx,qy,1)=lifar+(Int((diffro/gg(13))*qx))
          fabox(qx,qy,2)=lifag+(Int((diffgr/gg(13))*qx))
          fabox(qx,qy,3)=lifab+(Int((diffbl/gg(13))*qx))
        EndIf   
        ; x-achse Differenz links und rechts absolut
        If gg(19)=1
          If lifar<refar : fabox(qx,qy,1)=fabox(qx,qy,1)*(-1) : EndIf
          If lifag<refag : fabox(qx,qy,2)=fabox(qx,qy,2)*(-1) : EndIf
          If lifab<refab : fabox(qx,qy,3)=fabox(qx,qy,3)*(-1) : EndIf
        EndIf   
   Next qx
  Next qy
  ; -----Bild 0 erzeugen ------------------------------------
  StartDrawing(ImageOutput(0))
    For qy= 0 To 199
      For qx= 0 To 199
        farbe=RGB(fabox(qx,qy,1),fabox(qx,qy,2),fabox(qx,qy,3))
        Plot (qx,qy,farbe)
      Next qx
    Next qy  
  StopDrawing() 
  CopyImage(0, 4)
  ResizeImage(4,100,100)
  ; --------Bild 0 fertig -----------------------
  ; --------Bild 1 erzeugen ---------------------
  ; flip horizontal Bild0
  StartDrawing(ImageOutput(1))
    For qy=0 To 199
      For qx=0 To 99
      farv=fabox(199-qx,qy,1)
      fagv=fabox(199-qx,qy,2)
      fabv=fabox(199-qx,qy,3)
      Plot(qx,qy,RGB(farv,fagv,fabv))
      farh=fabox(qx,qy,1)
      fagh=fabox(qx,qy,2)
      fabh=fabox(qx,qy,3)
      Plot (199-qx,qy,RGB(farh,fagh,fabh))
    Next qx
  Next qy  
  StopDrawing()
  CopyImage(1, 5)
  ResizeImage(5,100,100)
  ; -------Bild 1 fertig ------------------------
  ; --------Bild 2 erzeugen ---------------------
  ; flip vertikal+horizontal  bild0
  StartDrawing(ImageOutput(2))
    For qy=0 To 99
      For qx=0 To 99
        f01=fabox(qx,qy,1)
        f02=fabox(qx,qy,2)
        f03=fabox(qx,qy,3)
        f11=fabox(199-qx,qy,1)
        f12=fabox(199-qx,qy,2)
        f13=fabox(199-qx,qy,3)
        f21=fabox(199-qx,199-qy,1)
        f22=fabox(199-qx,199-qy,2)
        f23=fabox(199-qx,199-qy,3)
        f31=fabox(qx,199-qy,1)
        f32=fabox(qx,199-qy,2)
        f33=fabox(qx,199-qy,3)
        
        Plot(qx,qy,RGB(f21,f22,f23))
        Plot(199-qx,qy,RGB(f31,f32,f33)) 
        Plot(199-qx,199-qy,RGB(f01,f02,f03))
        Plot(qx,199-qy,RGB(f11,f12,f13))
      Next qx
    Next qy  
  StopDrawing()
  CopyImage(2, 6)
  ResizeImage(6,100,100)
  ; --------Bild 3 fertig ---------------------
  ; --------Bild 3 erzeugen ---------------------
  ; flip vertikal bild0
  StartDrawing(ImageOutput(3))
    For qy=0 To 99
      For qx=0 To 199
        farv= fabox(qx,199-qy,1)
        fagv= fabox(qx,199-qy,2)
        fabv= fabox(qx,199-qy,3)
        Plot(qx,qy,RGB(farv,fagv,fabv))
        farh= fabox(qx,qy,1)     
        fagh= fabox(qx,qy,2)     
        fabh= fabox(qx,qy,3)     
        Plot (qx,199-qy,RGB(farh,fagh,fabh))
      Next qx
    Next qy  
  StopDrawing()
  CopyImage(3, 7)
  ResizeImage(7,100,100)
  ; --------Bild 3 fertig ---------------------
    
  EndProcedure
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 Procedure NEUZEICH()
 StartDrawing(WindowOutput(0))
      FrontColor(RGB(220,220,220)):Box(10,10,200,200)     
      DrawImage(ImageID(0), 10, 10)
      FrontColor(RGB(220,220,220)):Box(10,225,200,200)     
      If gg(20)>3:DrawImage(ImageID(gg(20)), 10,225):EndIf
      If gg(21)>3:DrawImage(ImageID(gg(21)),110,225):EndIf
      If gg(22)>3:DrawImage(ImageID(gg(22)),110,325):EndIf
      If gg(23)>3:DrawImage(ImageID(gg(23)), 10,325):EndIf
      FrontColor(RGB(220,220,220)):Box(10,440,200,200)     
      DrawImage(ImageID(9),10,440)
      ;ResizeImage(9,gg(14),gg(15))
      DrawImage(ImageID(9),10,440)
      StopDrawing()    
 EndProcedure   
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 Procedure GESTALTUNG()
   StartDrawing(WindowOutput(0))
   FreeImage(8)
   FreeImage(9)
   If gg(24)=0:xg=200:yg=200:EndIf
   If gg(24)=1:xg=100:yg=100:EndIf
   If gg(24)=2:xg=200:yg=100:EndIf
   If gg(24)=3:xg=100:yg=200:EndIf
   CreateImage(8,xg,yg)
   CreateImage(9,xg,yg)
     GrabDrawingImage(8,10,225,xg,yg)
   StopDrawing()
   CopyImage(8,9)
   
 EndProcedure
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 

Re: Teil 2: Anfängerprobleme beim ersten Programm

Verfasst: 15.06.2014 15:18
von mk-soft
Dafür gibt es Events. Bei direkten Drawing auf Window muss man bei den Event Repaint auch neu zeichnen.

Code: Alles auswählen

Repeat
    Event = WaitWindowEvent()
    ;
    If event = #PB_Event_Repaint
      NEUZEICH()
    EndIf
    If event = #PB_Event_SizeWindow
      win_dx = WindowWidth(0)
      win_dy = WindowHeight(0)
      NEUZEICH()
    EndIf
P.S. WindowWidth und Height liefert die Grösse im Clientbereich zurück