Grafik wird "wegradiert"

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Grafik wird "wegradiert"

Beitrag von kartmanne »

HI,

Ich fange gerade an, mit den 2D-Grafikdingen zu üben.
Ich habe ein Fenster(#window_hd) mit Gadgets, auf dem ich in einem Bereich Linien ausgebe. Das funzt auch. Mit einem Button des Fensters kann ich eine Dateiauswahlbox (OpenFileRequester(blabla)) öffnen, um eine Datei zu laden. Wenn ich nun diese Dateiauswahlbox mit der Maus anfasse und auf dem Bildschirm verschiebe (und damit auch über meinem Fenster), "radiert" diese Box die Linien weg. Die Gadgets des Fensters werden nicht radiert.

Wie kann ich das "wegradieren" verhindern?

Die Grafik ist so aufgebaut:

Code: Alles auswählen

StartDrawing(WindowOutput(Window_hd))
SetOrigin (x,y)
linexy(a,b,c,d,farbe)
...
StopDrawing()
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: Grafik wird "wegradiert"

Beitrag von ts-soft »

Den Rest vom Code raten wir mal :lol:

Es gibt viele Möglichkeiten, wobei eine Procedure am einfachsten wäre. Aber ich lasse die mal weg und mach das wie Du :twisted:

Code: Alles auswählen

...

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    
    Case #PB_Event_Repaint
      StartDrawing(WindowOutput(#Window_hd))
      SetOrigin (x, y)
      LineXY(a, b, c, d, farbe)
      ...
      StopDrawing()
    
    ...
  EndSelect

ForEver
Gruß
Thomas
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
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: Grafik wird "wegradiert"

Beitrag von kartmanne »

HI,
:D :D :D
Ich könnte den bisherigen code hier posten (830+Zeilen). Das find ich übertrieben. :wink:
Da der Rest meines Programms läuft, denke ich, es liegt daran, wie ich die Grafikdinge organisiere, deshalb hab ich genau nur das getippert. Die "..." sind lediglich LineXY()-ausgaben in Schleifen mit Berechnungen. Das zu posten bringt keinen Nährwert für mein Problem, sondern nur "gleicher" code, der zu lesen ist. Und mehr Befehle hab ich zur Grafik derzeit nicht verwendet.

Ich vermute, dass etwas (vor-)eingestellt werden muß; die Zusammenhänge für die 2d_Grafik hab ich noch nicht so ganz erfaßt. Dies ist meine erster Versuch...

Was ich nicht verstehe ist, dass das Fenster mit allen Gadgets beim Drüberverschieben der Dateiauswahlbox immer neugezeichnet wird - die Linien aber nicht.

Das Neuzeichnen des Fensters wird ja "von windows" selbst gemacht. Die Linien hab ich also mit dem Ausgabekanal ans Fenster(window_hd) geknüpft. Aber diese Überlegung war wohl ...zu optimistisch. /:->

Nachtrag:
Wenn ich den #pb_event_repaint nutze (siehe dein Beispiel) kann ich nach dem Verschieben die Grafik neu zeichen. Solch Dinge verstehe ich schon :-)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Grafik wird "wegradiert"

Beitrag von Danilo »

Wenn Dein Zeichenbereich frei stehend ist, also nicht mit Gadgets überlappt,
dann erstelle für diesen Bereich ein CanvasGadget und zeichne darin.

Während die Dateiauswahlbox geöffnet ist, läuft die Nachrichtenschleife von PB
bestimmt nicht komplett, so wie mit anderen modalen Dialogen/Requestern auch.
Dann musst Du #PB_Event_Repaint durch BindEvent() mit einer Prozedur verknüpfen,
die dann automatisch aufgerufen werden kann.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
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: Grafik wird "wegradiert"

Beitrag von ts-soft »

kartmanne hat geschrieben:Ich könnte den bisherigen code hier posten (830+Zeilen). Das find ich übertrieben. :wink:
Bloß nicht, aber den Code kürzen, so das er lauffähig ist. Also min. GUI Aufbau und EventLoop. Da kommste dann schon
mit weit weniger als 100 Zeilen Code hin. Wir sehen mehr von Deinem Code und können leichter helfen.

Gruß
Thomas
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
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: Grafik wird "wegradiert"

Beitrag von kartmanne »

HI,

es ist für mich noch schwierig, die Ballance zu finden, wieviel ich posten sollte, und wieviel nicht. Ich hab mal die Ereignisschleife zusammengekürzt unten dargestellt (sind derzeit um die 430 Zeilen). Damit ist hoffentlich erkennbar, wie die funktioniert.

Inzwischen bin ich einen Schritt weiter und habe diese Lösung gefunden. Der Hinweis mit dem Canvasgadget hat mich inspiriert. Ich habe erstmal ein imagegadget genommen. Die Idee ist ja die gleiche: Ein gadget ins Fenster legen, denn dieses wird von windows selbst nach "Fensterdrüberwischen" aktualisiert

Ich habe diese Lösung gefunden:

hauptdialog:

Code: Alles auswählen

Global Window_hd
Global  Image_ankf_hd
Procedure OpenWindow_hd(x = 0, y = 0, width = 795, height = 600)
Window_hd = OpenWindow(#PB_Any, x, y, width, height, "text",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
Button1_hd = ButtonGadget(#PB_Any, 684, 562, 100, 30, "Zeichnen")
Button2_hd = ButtonGadget(#PB_Any, 480, 562, 100, 30, "Speichern")
Image_ankf_hd = ImageGadget(#PB_Any, 10, 240, 450, 278, 0)
EndProcedure
programm:

Code: Alles auswählen

IncludeFile "Hauptdialog.pbf"
OpenWindow_hd()
img_ankf=CreateImage(#PB_Any,450,278,0,rgb(127,127,127))
Repeat
  event = WaitWindowEvent()
  select event
    case #PB_Event_Gadget
      select eventgadget()
        case Button1_hd
           sub_zeichnen
        case Button2_hd
           a$=SaveFileRequester("Setup speichern",dateipfad$+dateiname$,"cde-Dateien|*.cde",0)
           datei bearbeiten
           ...
       endselect
     endselect
forever
end


sub_zeichnen:
StartDrawing(ImageOutput(img_ankf))
SetOrigin (x,y)
linexy(a,b,c,d,farbe)
...
StopDrawing()
SetGadgetState(image_ankf_hd,ImageID(img_ankf))
return
Damit muß nach jedem Bearbeiten des image ein

Code: Alles auswählen

SetGadgetState(image_ankf_hd,ImageID(img_ankf))
setzten, damit die Anzeige im Fenster aktualisiert wird. Das funktioniert gut.
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: Grafik wird "wegradiert"

Beitrag von ts-soft »

Okay, ein paar Tipps:
1. Nutze EnableExplicit, damit Fehler in Variablenbennungen o. ä. ausgeschlossen sind. Am Anfang vielleicht etwas mehr Arbeit, aber es lohnt sich.
2. Nutze Proceduren statt Gosub! Der Code wird besser lesbar und auch wartbar.
3. Wenn das Bild veränderlich ist, solltest Du ein CanvasGadget nutzen.
4. Poste hier am besten nur Code, der per Copy & Paste in die IDE eingefügt werden kann und sofort ausführbar ist. Dies ist wichtig für alle Helfer (sonst gibts auch nicht so viele :) ).

Ansonsten freut mich, wenn Dein Problem erstmal gelöst ist.

Gruß
Thomas
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
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: Grafik wird "wegradiert"

Beitrag von kartmanne »

HI,

werde mich bemühen... :)
Wenn das Bild veränderlich ist, solltest Du ein CanvasGadget nutzen.
Warum?
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: Grafik wird "wegradiert"

Beitrag von ts-soft »

Weil es dafür prädistiniert ist :mrgreen:
Hier mal einen Auszug aus der Hilfe:
purebasic.chm hat geschrieben:Der gezeichnete Inhalt bleibt erhalten, bis er durch weitere Zeichen-Operationen gelöscht wird. Es ist nicht erforderlich, den Inhalt jedes Mal neu zu zeichnen, wenn ein #PB_Event_Repaint Ereignis empfangen wird.
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
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: Grafik wird "wegradiert"

Beitrag von kartmanne »

HI,

danke :)

habe das CanvasGadget probiert. Ich sehe, dass alle Zeichenoperationen (bei mit nur linexy) sofort und für den Betrachter sichtbar durchgeführt werden. OK. Das dauert bei meinen 624 Linies etwas. Nutze ich das ImageGadget, dann sieht der Betrachter nicht, wie die vielen Linexy nacheinander ausgeführt werden. Sichtbar wird das (Ergebnis) erst, wenn ich mit SetGadgetState das verborgen gezeichnete Bild ans ImageGadget melde. Das ist dann extrem schnell.

Insgesamt ist die ImageGadget-Lösung durch die Ausführungsgeschwindigkeit für mich die bessere Lösung.

...da aber noch mehr Aufgaben für die Zeichnrei kommen, schau ich, welche der beiden dann am Ende das bessere ist :wink:
Antworten