Seite 1 von 2

Auf erstelltes Diagrammraster zeichnen

Verfasst: 24.09.2012 11:09
von Microman
@ Ein Hallo an alle hier im Forum,

ich bin ja schon etwas länger hier im Forum gemeldet, habe aber bis jetzt nur lesender Weise versucht, aus den vorhandenen Beiträgen das benötigte Wissen für mich abzuleiten. Einiges habe ich auch hinbekommen.
Doch jetzt zu meinem Problem:
Ich habe ein Fenster erstellt, in das ich ein XY-Diagramm mit Raster und Beschriftungen dargestellt habe. Dazu habe ich die 2DDrawing-Befehle benutzt. Soweit klar. Nun starte ich durch Druck auf ein bestimmtes "Button-Gadget" meine Messung. Wenn ich jetzt mittels des LineXY-Befehls meine Messkurve auf dieses "bestehende" Diagram zeichnen lasse, ist mein Diagrammbild nach erneutem Aufruf des "StartDrawing"-Befehls verschwunden. Das dieses so verhält, wird im Befehlshandbuch auch erwähnt, aber ich vermisse die Lösung, wie ich das Ganze hinbekommen kann, soll heißen: Wie kann ich auf ein mit den 2DDrawing Befehlen erstelltes Bild "drüberzeichnen" ohne den vorhandenen Bildinhalt dabei zu löschen???

Irgendwie stehe ich da auf dem Schlauch und brauche eure Hilfe.

vielen Dank schonmal vorab

Microman

Re: Auf erstelltes Diagrammraster zeichnen

Verfasst: 24.09.2012 14:14
von STARGÅTE
Vermutlich zeichnest du auf dem Fenster.
Es wäre besser das CanvasGadget zu verwenden:
http://www.purebasic.com/german/documen ... adget.html
Unten kannst du auch ein Beispiel dazu sehen, wie du es dnan auch machen kannst.
Dort wird ja auch ununterbrochen "drüber" gezeichnet.

Re: Auf erstelltes Diagrammraster zeichnen

Verfasst: 24.09.2012 22:15
von Microman
@ Stargate,
du hast recht, ich zeichne direkt in das Fenster. Ich habe auch gelesen, das das so nicht der richtige Weg ist, von wegen des überschreibens der Grafik beim Verschieben der Fenster, aber ich tue mich mit der Fenstertechnik irgendwie schwer. Der Begriff "Leinwand" sagt mir im Zusammenhang mit den Zeichenfunktionen auch nichts; da gibts aber noch mehr solcher Begriffe, die ich nicht einordnen kann, so z.B. "Alpha Blending". Ich habe die Abhandlung darüber schon zig-fach gelesen, aber da ist bei mir (noch) ein Brett vor dem Kopf.
Trotzdem vielen Dank; ich werde mal weiterlesen . . . .
cu
Microman

Re: Auf erstelltes Diagrammraster zeichnen

Verfasst: 25.09.2012 07:54
von BSP
Hallo Microman.
Vieleicht hilft Dir ja folgendes Beispiel.
Ich arbeite immer noch gerne mit Images.
Das liegt vieleicht daran,
das sich mir das Canvas noch nicht so wirklich erschlossen hat.

Code: Alles auswählen

#hwnd=0   ; HauptFenster

#image=0     ; Image (Bild)
#imagegadg=0 ; Imagegadget

OpenWindow(#hwnd,0,0,400,400,"Kaleidoskop",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateImage(#image,WindowWidth(#hwnd),WindowHeight(#hwnd))
ImageGadget(#imagegadg,0,0,ImageWidth(#image),ImageHeight(#image),ImageID(#image))

xm=ImageWidth(#image)/2
ym=ImageHeight(#image)/2
x=0 : y=0

Repeat

; Neue Pos ermitteln
x+Random(2)-1
y+Random(2)-1
If xm+x<4 Or xm+x>ImageWidth(#image)-4
  x=0
EndIf
If ym+y<4 Or ym+y>ImageHeight(#image)-4
  y=0
EndIf

StartDrawing(ImageOutput(#image)) ; Zeichnen auf Bild einleiten
  If x=0 Or y=0 Or Point(xm+x,ym+y)=c; Neue Farbe
    color1=Random(255)
    color2=Random(255)
    color3=Random(255)
    c=RGB(color1,color2,color3)
  EndIf

; Nun zeichnen
  Plot(xm+x,ym+y,c)
  Plot(xm+x,ym-y,c)
  Plot(xm-x,ym+y,c)
  Plot(xm-x,ym-y,c)
StopDrawing(); Zeichnen beenden

SetGadgetState(#imagegadg,ImageID(#image)); Bild übernehmen

Until WaitWindowEvent(2)=#PB_Event_CloseWindow
Gruß: Bernd

PS: Hatte einen kleinen Fehler in der Bestimmung der Pos- Grenzen.
Hab's berichtigt.
Sorry.

Re: Auf erstelltes Diagrammraster zeichnen

Verfasst: 25.09.2012 22:28
von Microman
@ Bernd,
Danke dir für deinen Beitrag. Ich werde mir das alles nochmal in Ruhe verinnerlichen in der Hoffnung,
das ich dann die Fehler in meinem Programm beheben kann.
Bis dann . . .

cu
Reiner

Re: Auf erstelltes Diagrammraster zeichnen

Verfasst: 26.09.2012 15:47
von bobobo
Hi microman und BSB
canvasgadget ist ja nun nicht so schwer
(Canvas bedeutet sowas wie Leinwand und auf sowas kann man malen
wie auf einem Image, welches dann aber erst wieder einem Imagegadget
zugewiesen werden muss)

Canvasgadget hat den weiteren Vorteil, dass mehr Events abgefangen
werden können als in einem Imagegadget

obiges mal als Canvasgadget
(im übrigen ist das immer wieder neuermitteln der imagegrößen der performance auf dauer eher abträglich:))

Code: Alles auswählen

#hwnd=0   ; HauptFenster

;#image=0     ; Image (Bild)
#imagegadg=0 ; Imagegadget ach ne .. canvasgadget

OpenWindow(#hwnd,0,0,400,400,"Kaleidoskop",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
;CreateImage(#image,WindowWidth(#hwnd),WindowHeight(#hwnd))
cw=WindowWidth(#hwnd)
ch=WindowHeight(#hwnd)
CanvasGadget(#imagegadg,0,0,cw,ch);,ImageID(#image))

xm=cw/2
ym=ch/2
x=0 : y=0
StartDrawing(CanvasOutput(#imagegadg))
  Box(0,0,cw,ch,#Black)
StopDrawing()

Repeat

; Neue Pos ermitteln
x+Random(2)-1
y+Random(2)-1
If xm+x<4 Or xm+x>cw-4
  x=0
EndIf
If ym+y<4 Or ym+y>ch-4
  y=0
EndIf

StartDrawing(CanvasOutput(#imagegadg)) ; Zeichnen auf Bild einleiten
  If x=0 Or y=0 Or Point(xm+x,ym+y)=c; Neue Farbe
    color1=Random(255)
    color2=Random(255)
    color3=Random(255)
    c=RGB(color1,color2,color3)
  EndIf

; Nun zeichnen
  Plot(xm+x,ym+y,c)
  Plot(xm+x,ym-y,c)
  Plot(xm-x,ym+y,c)
  Plot(xm-x,ym-y,c)
StopDrawing(); Zeichnen beenden

;SetGadgetState(#imagegadg,ImageID(#image)); Bild übernehmen

Until WaitWindowEvent(2)=#PB_Event_CloseWindow

Re: Auf erstelltes Diagrammraster zeichnen

Verfasst: 26.09.2012 21:38
von Microman
@bobobo,

Ebenfalls ein interessanter Beitrag von Dir zu meinem Problem.
Etwas unterschiedliche Programmierung, aber gleicher visueller Effekt.
Sobald ich etwas Zeit habe, drucke ich mir die Listings von dir und BSB aus und studiere sie.
Ich hoffe mal, das bei mir jetzt mal der Groschen zu dem Thema fällt.....

cu
Microman

Re: Auf erstelltes Diagrammraster zeichnen

Verfasst: 27.09.2012 02:49
von BSP
Hallo bobobo.
(im übrigen ist das immer wieder neuermitteln der imagegrößen der performance auf dauer eher abträglich:))
Normalerweise speicher ich die Werte auch immer in Variablen zwischen.
Dieses mal wollte ich mein Beispiel aber nicht zu sehr überladen,
damit das wichtigste eher im Auge bleibt.
Wie man's macht, man macht immer was falsch. Smile.
Aber nun zum Kern:
Wenn ich das richtig sehe, wird beim Canvas jeder Zeichenbefehl sofort sichtbar.
Und das ist mit ein Grund, warum ich Images benutze.
Bei meinem Modellbahn- Stellpult z.B. zeichne ich erst alle Aktionen
und mache die dann auf einen Schlag sichtbar.
Also erst alle Gleis, Signal und Zugmelder zeichnen. Weichenstellungen und was sonst noch so anfällt.
Und wenn fertig, alles auf einen Schlag anzeigen. In diesem Fall finde ich, sieht das dann besser aus.
Oder habe ich da was Grundlegendes übersehen?

Beim Canvas gut finde ich z.B., das dass Gadget auch auf Tastaturereignisse reagiert.
Ich hatte mir mal einen eigenen kleinen Editor zu Rechnen gebastelt.
Hätte es da schon das Canvas gegeben, hätte ich das sicher da schon genommen.

@Microman.
Im Prinzip ist es immer der gleiche Vorgang. Egal, worauf Du zeichnest.
Fenster, Drucker, Sprite, Image, Canvas.
Mit StartDrawing() öffnest Du Deinen Zeichenkanal,
dann machst Du Deine Zeichnungen,
wenn fertig, mit StopDrawing() den Kanal wieder schliessen.
Beim Canvas hast Du das dann dirkt sichtbar,
beim Image musst Du die Zeichnung dann mit
SetGadgetState(#Gadget,ImageId(#Image)) übernehmen.

Gruß: Bernd

Re: Auf erstelltes Diagrammraster zeichnen

Verfasst: 27.09.2012 04:44
von BSP
nochmal an bobobo
Sehe ich das richtig?
Das Canvas wird erst aktualisiert, wenn
StopDrawing()
aufgerufen wird?
Ich hatte mir ein kleines Prg geschrieben,
wo ich meinen Stromstand eintrage und als Verbrauchsgraf anzeigen lasse.
Da werden in's Bild ein paar Informationen geschrieben,
die Zeitlinien gezeichnet, dann der Verbrauchsgraf,
dann noch mal ein paar kleine Schildchen mit Zahlen, z.B. der Durchschnittsverbrauch, gezeichnet.

Nun habe ich das Prg mal aufs Canvas geändert.
Ich hatte mehr "Flackern" erwartet.
Mir scheint, das Canvas kannwas. Grins.

Gruß: Bernd

Re: Auf erstelltes Diagrammraster zeichnen

Verfasst: 27.09.2012 04:52
von STARGÅTE
Das Canvas wird erst aktualisiert, wenn
StopDrawing()
aufgerufen wird?
Richtig.
Auch das CanvasGadget besitzt sowas wie einen Doppelpuffer (einer der angezeigt wird, einer auf dem gemalt wird) und bei StopDrawing() wird einfach getauscht.