Teil 2: Anfängerprobleme beim ersten Programm

Anfängerfragen zum Programmieren mit PureBasic.
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Teil 2: Anfängerprobleme beim ersten Programm

Beitrag 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   
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 


Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Teil 2: Anfängerprobleme beim ersten Programm

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Teil 2: Anfängerprobleme beim ersten Programm

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Teil 2: Anfängerprobleme beim ersten Programm

Beitrag von NicTheQuick »

EnableExplicit *hust* :wink:
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Teil 2: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

@Matbal

Danke, das war's, ich hab' den Code mind.
100 mal gelesen, ich habe es aber um's Verrecken nicht
gesehen.
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

Re: Teil 2: Anfängerprobleme beim ersten Programm

Beitrag von ts-soft »

Mit EnableExplicit hättest den Code wahrscheinlich nur einmal gelesen :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
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Teil 2: Anfängerprobleme beim ersten Programm

Beitrag 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
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Teil 2: Anfängerprobleme beim ersten Programm

Beitrag 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:
PB 4.00 | Windows XP Home SP3
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Teil 2: Anfängerprobleme beim ersten Programm

Beitrag 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
 ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ 
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Teil 2: Anfängerprobleme beim ersten Programm

Beitrag 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
Zuletzt geändert von mk-soft am 15.06.2014 15:30, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten