Auf erstelltes Diagrammraster zeichnen
Auf erstelltes Diagrammraster zeichnen
@ 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
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
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.
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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Auf erstelltes Diagrammraster zeichnen
@ 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
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
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.
Gruß: Bernd
PS: Hatte einen kleinen Fehler in der Bestimmung der Pos- Grenzen.
Hab's berichtigt.
Sorry.
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
PS: Hatte einen kleinen Fehler in der Bestimmung der Pos- Grenzen.
Hab's berichtigt.
Sorry.
PB 5.31 (x86) & (x64) Win10
Re: Auf erstelltes Diagrammraster zeichnen
@ 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
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
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:))
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
pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Re: Auf erstelltes Diagrammraster zeichnen
@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
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
Hallo bobobo.
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
Normalerweise speicher ich die Werte auch immer in Variablen zwischen.(im übrigen ist das immer wieder neuermitteln der imagegrößen der performance auf dauer eher abträglich:))
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
PB 5.31 (x86) & (x64) Win10
Re: Auf erstelltes Diagrammraster zeichnen
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
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
PB 5.31 (x86) & (x64) Win10
Re: Auf erstelltes Diagrammraster zeichnen
Richtig.Das Canvas wird erst aktualisiert, wenn
StopDrawing()
aufgerufen wird?
Auch das CanvasGadget besitzt sowas wie einen Doppelpuffer (einer der angezeigt wird, einer auf dem gemalt wird) und bei StopDrawing() wird einfach getauscht.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr