Seite 1 von 2

Grafik wird "wegradiert"

Verfasst: 18.04.2015 22:11
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()

Re: Grafik wird "wegradiert"

Verfasst: 18.04.2015 22:45
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

Re: Grafik wird "wegradiert"

Verfasst: 18.04.2015 23:28
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 :-)

Re: Grafik wird "wegradiert"

Verfasst: 18.04.2015 23:42
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.

Re: Grafik wird "wegradiert"

Verfasst: 19.04.2015 10:32
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

Re: Grafik wird "wegradiert"

Verfasst: 19.04.2015 11:48
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.

Re: Grafik wird "wegradiert"

Verfasst: 19.04.2015 12:35
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

Re: Grafik wird "wegradiert"

Verfasst: 19.04.2015 12:41
von kartmanne
HI,

werde mich bemühen... :)
Wenn das Bild veränderlich ist, solltest Du ein CanvasGadget nutzen.
Warum?

Re: Grafik wird "wegradiert"

Verfasst: 19.04.2015 14:30
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.

Re: Grafik wird "wegradiert"

Verfasst: 20.04.2015 20:17
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: