Seite 1 von 2

Auswahlrahmen auf einer Grafik ???

Verfasst: 02.09.2009 09:51
von Donald
Hi,

wie kann man einen Auswahlrahmen auf ein Grafikfeld bringen,
ohne das mir dann die unter dem Rahmen ligende Grafik "zerstört"
wird, bzw. das diese erst immer wieder neu geladen werden muß.
Über Tips bin ich dankbar.

Gruß Donald



Bild

Verfasst: 02.09.2009 10:20
von Kaeru Gaman
wenn du direkt auf die Grafik zeichnen willst, probiers mal mit mehreren "Masken".
also dein Bild lädst du in Image#1, das Drawst du in Image#2, zeichnest den Rahmen drüber, und packst Image#2 in das ImageGadget.

Beispiel für mehrere ImageLayer:
http://www.purebasic.fr/german/viewtopic.php?t=19394

... allerdings gibt es glaubich auch irgendwo ein Canvas-Gadget von nem Kollegen gebaut,
und für den Auswahlrahmen gibts bestimmt auch ne API Funktion...

Verfasst: 02.09.2009 12:18
von Fluid Byte
Wenn du uns verrätst was ein "Grafikfeld" ist kann man dir vielleicht helfen.

Verfasst: 02.09.2009 12:39
von Donald
Hi,
Ok, dann versuche ich es mal was besser zu beschreiben was ich vorhabe.
Ein einem Grafikfile sind mehrere kleine Grafiken, welche alle die gleiche
größe haben. Nun brauche ich aber nicht alle Grafiken vor ein Projekt, und
wollte deshalb entsprechend ein wenig Sortieren, das heißt.

Ich lade ein Grafikfile ein, wähle die entsprechende Grafik aus und setze
es in ein neues File, dann die nächste kleine Grafik usw. bis ich alles habe
die ich brauche und speicher mir dann das neue File ab.

Soweit komme ich ja klar, nur mit dem Auswahlrahmen habe ich so meine
Probleme.

Zur Anmerkung, bisher habe ich es mit einem Grafikprogramm gemacht, aber das ist eine sau Arbeit.

Gruß Donald

Verfasst: 02.09.2009 13:00
von Kaeru Gaman
du lese auche meine Beitrag, Companero.

Verfasst: 02.09.2009 14:50
von Donald
Kaeru Gaman hat geschrieben:du lese auche meine Beitrag, Companero.
Hi,
na hab ich doch gelesen.

An sowas in der Art hatte ich ja auch schon gedacht.
- Image einlesen und auf dem Bildschirm platzieren.
- Dann entspechend der Mausposition das entsprechende Feld zwischenlagern und eine Kopie mit Rahmen setze.
- Beim verlassen des Feldes wieder das Stück Grafik ohne Rahmen einsetzen
- usw.

Dachte vielleicht gibt es ja irgendwas einfacheres welches ich bisher noch nicht kenne.

Gruß Donald

..

Verfasst: 02.09.2009 15:59
von Kurzer
Habe gerade kein PB verfügbar, aber mal so ins blaue geraten:
Kann man nicht ein Rect im XOR-Drawmodus zeichnen?

Habe vor langer Zeit mal nen Appelmann-Programm in Delphi geschrieben, da konnte man auch mit der Maus nen Zoom-Rahmen aufziehen.
Vorgehensweise war dann bei mousemove:

- Rect an alte Position mit xor zeichnen
- Rect an neue Position mit xor zeichnen
- neue Position in variablen alte Position speichern

Dann haste zwar u.U. etwas "bunte Linien" (weil XOR mit dem Hintergrund verknüpft), aber Du musst keinen Hintergrund sichern und wiederherstellen.
Der wird durch das zweite XOR-Rect wieder in den Ursprungszustand versetzt.

Ich hoffe, das war einigermaßen verständlich erklärt. ;)


EDIT: Okay hier ist was zum compilieren.
Du müsstest den Rahmen allerdings nur zeichnen, wenn sich die maus bewegt hat. Da habe ich jetzt mal ein bißchen geschludert und den Rahmen immer wieder zeichenen lassen.
; Code für 4.31

Code: Alles auswählen

If OpenWindow(0, 100, 200, 300, 200, "XOR Test")

	Mx = -400 : My = -400
	StartDrawing(WindowOutput(0))
		For t = 0 To 2000
    	Box (Random(300), Random(200), 4, 4, Random($ffffff))
    Next t
  StopDrawing()

  Repeat
    EventID = WaitWindowEvent(25) 
    If WindowMouseX(0) > 0 And WindowMouseY(0) > 0
	  	StartDrawing(WindowOutput(0))
		    DrawingMode(#PB_2DDrawing_XOr)
		    Box(Mx, My, 40, 40)
		    Box(Mx+1, My+1, 38, 38)
		    Delay(5)
		    Box(WindowMouseX(0)-20, WindowMouseY(0)-20, 40, 40)
		    Box(WindowMouseX(0)-19, WindowMouseY(0)-19, 38, 38)
		    Mx = WindowMouseX(0)-20 : My = WindowMouseY(0)-20
	    StopDrawing()
		EndIf
  Until EventID = #PB_Event_CloseWindow
EndIf
EDIT 2: Komischerwiese funktioniert es nicht mehr, wenn zeitgleich eine Visualisierung des XM-Players (Musikplayer, ähnlich WinAmp) läuft!
Dann gibt es üblen Pixelmüll. Ich vermute, daß die XMP-Visualisierung den Drawmodus ändert. Frage mich dann aber gleich, wieso das Programmübergreifend Auswirkungen hat. :shock:

EDIT 3: Das ist ja komisch. Ich habe es jetzt mal auf einem anderen Rechner ausprobiert (ohne den XMPlayer nebenbei laufen zu lassen) und da gibts trotzdem "Pixelschmierer", wenn man die Box heftig über das Fenster zottelt.
Der Schuldige hierfür scheint das Delay(5) zu sein. Nehme ich die Zeile raus, dann arbeitet das Programm völlig sauber.
Kann mir das mal jemand erklären?

EDIT 4: Schön, wenn man seine Fehler selbst erkennt. In der Ruhe liegt die Kraft. Man sollte Beispielcode nicht unter Zeitdruck erstellen. /:->
Das Problem war, daß ich die Mausposition mehrmals abgefragt habe, statt nur einmal und die Werte dann in Variablen zwischenzuspeichern.

Hier jetzt ein funktionierendes Beispiel, das auch nur zeichnet, wenn die Maus bewegt wird:

Code: Alles auswählen

If OpenWindow(0, 100, 200, 600, 600, "XOR Test")

   Mxold = -400 : Myold = -400
   StartDrawing(WindowOutput(0))
      For t = 0 To 2000
       Circle (10+Random(580), 10+Random(580), Random(10), Random($ffffff))
    Next t
  StopDrawing()

  Repeat
    EventID = WaitWindowEvent(25)
		
    If EventID = 512 ; (Habe für Mousemove keien passende Konstante gefunden)
        StartDrawing(WindowOutput(0))
          DrawingMode(#PB_2DDrawing_XOr)

          Box(Mxold, Myold, 40, 40)
          Box(Mxold+1, Myold+1, 38, 38)

				  Mxnew = WindowMouseX(0) : Mynew = WindowMouseY(0)
          Box(Mxnew, Mynew, 40, 40)
          Box(Mxnew+1, Mynew+1, 38, 38)

          Mxold = Mxnew : Myold = Mynew
       StopDrawing()
      EndIf
  Until EventID = #PB_Event_CloseWindow
EndIf 
PS: Man sollte vielleicht 4 Linien für den Rahmen benutzen statt eine "ausgestanzte" Box, aber das spielt für das Beispiel hier ja keine Rolle.

Verfasst: 03.09.2009 15:13
von Rokur
Hier ein Beispiel mit einfarbigem Rahmen (einfach drauf zeichnen, ohne xor), wenn die Kacheln alle aneinanderliegen und die gleiche Größe haben:

Die Variablen gridSize, path und color bitte nach Bedarf anpassen

Code: Alles auswählen

EnableExplicit

OpenWindow(0,0,0,400,400,"Auswahlrahmen",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

Global gridSize = 32
Global path.s = "c:\test.bmp"
Global color = #Green

LoadImage(0,path)
If Not IsImage(0)
  Debug "Fehler beim Laden von "+path+"!"
  End
EndIf

CreateImage(1,ImageWidth(0),ImageHeight(0))

Procedure repaint()
  Protected x, y
  x = WindowMouseX(0)
  y = WindowMouseY(0)
  StartDrawing(ImageOutput(1))
    DrawImage(ImageID(0),0,0)
    If x <> -1 And y <> -1
      x = gridSize * Round(x/gridSize,#PB_Round_Down)
      y = gridSize * Round(y/gridSize,#PB_Round_Down)
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(x,y,gridSize,gridSize,color)
    EndIf
  StopDrawing()
  StartDrawing(WindowOutput(0))
    DrawImage(ImageID(1),0,0)
  StopDrawing()
EndProcedure

Repeat
  Define event = WaitWindowEvent(10)
  
  Select event
    Case #PB_Event_CloseWindow
      End
  EndSelect
  
  repaint()
ForEver

Verfasst: 03.09.2009 15:44
von Kurzer
Rokur, wenn ich Donald richtig verstanden habe, dann kennt er die Version mit dem Restaurieren des Hintergrund-Images schon (siehe seinen ersten Post)
Donald hat geschrieben:wie kann man einen Auswahlrahmen auf ein Grafikfeld bringen,
ohne das mir dann die unter dem Rahmen ligende Grafik "zerstört"
wird, bzw. das diese erst immer wieder neu geladen werden muß.
"neu geladen werden muß" ist vielleicht ein bißchen unglücklich ausgedrückt, aber ich denke er meinte damit das Restaurieren des Images.
Donald hat geschrieben:Dachte vielleicht gibt es ja irgendwas einfacheres welches ich bisher noch nicht kenne.
Ach Mensch, jetzt wo ich Deinen Code sehe klatsch ich mir selbt wieder vor die Birne. :)
Den DrawMode #PB_2DDrawing_Outlined hab ich ja mal sowas von weg-ignoriert. Den kann doch in meinem Code prima mit dem #PB_2DDrawing_XOr verknüpfen und mir dadurch das Gehampel mit dem Ausstanzen der gefüllten Box sparen.

Tse tse tse, Kurzer, Du wirst ja sooo alt. <)

Verfasst: 03.09.2009 19:09
von Donald
Hi,

uiiii, hier hat sich ja richtig was getan.

Das Programm läuft aber schon :)
Habs halt erstmal wie ich oben beschrieben hatte gemacht.
Vielleicht wird das eine oder andere von Euren klasse Tips noch beim
nächsten ändern mit eingebaut, mal sehen, die Hauptsache ist es läuft
erstmal so wie es soll.


Gruß Donald