Seite 1 von 4

Linie zeichnen

Verfasst: 30.06.2011 13:30
von Velindos
Hallo, habe folgendes Problem, will ein Image aufnehmen und mit Rotstift korrigieren. Möchte einfach eine Linie von A nach B ziehen und auf das Image zeichen. Komme nicht recht weiter, kann jemand helfen?

Nun das Beispiel geht wie folgt: linke Maustaste "START" und rechte Maustaste "ENDE" und die Linie zeichnen!

Code: Alles auswählen

Enumeration
  #Window_main
EndEnumeration
;
Enumeration
  #Image_gadget
  #Button_Neu
  #Button_Speichern
  #RotstifImage
EndEnumeration

Structure Punkt
  x.l
  y.l
EndStructure

MausPos.Punkt

CreateImage(#RotstifImage, 650, 650)
StartDrawing(ImageOutput(#RotstifImage))
Box(0, 0 , 650, 650, RGB(255,255,0))
StopDrawing()

Procedure Open_Window_main()
  If OpenWindow(#Window_main, 0, 0, 667, 706, "Image Rotstift",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_main))
      ;ImageGadget(#Image_gadget, 40, 40, 520, 580, )
      ImageGadget(#Image_gadget, 9, 53, 650, 650, ImageID(#RotstifImage))

    EndIf
  EndIf
EndProcedure

Open_window_main()

Repeat
  event= WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #image_gadget
          Select EventType()
            Case #PB_EventType_LeftClick
              MausPos\x = WindowMouseX(#window_main)
              MausPos\y = WindowMouseY(#window_main)
              
              Debug Str(MausPos\x)+" ss " + Str(MausPos\y)
              
              StartDrawing(ImageOutput(#RotstifImage))
              ;Box(MausPos\x -20, MausPos\y -20, 10, 10, RGB(0,0,255))
              ;Box(WindowMouseX(#window_main)-9, WindowMouseY(#window_main)-53, 1, 1, RGB(0,0,255))
              ;LineXY(WindowMouseX(#window_main)-9, WindowMouseY(#window_main)-53, 1, 1, RGB(0,0,255))
              StartLinie_X=(WindowMouseX(#window_main)-9)
              StartLinie_Y=(WindowMouseY(#window_main)-53)
              StopDrawing()
              
            Case #PB_EventType_RightClick
              MausPos\x = WindowMouseX(#window_main)
              MausPos\y = WindowMouseY(#window_main)
              Debug Str(MausPos\x)+" ss " + Str(MausPos\y)
              
              StartDrawing(ImageOutput(#RotstifImage))
              ;Box(MausPos\x -20, MausPos\y -20, 10, 10, RGB(0,0,255))
              ;Box(WindowMouseX(#window_main)-9, WindowMouseY(#window_main)-53, 1, 1, RGB(0,0,255))
              LineXY(WindowMouseX(#window_main)-9, WindowMouseY(#window_main)-53, StartLinie_X, StartLinie_Y, RGB(248, 13, 7))
              StopDrawing()
              
              SetGadgetState(#image_gadget, ImageID(#RotstifImage))

          EndSelect
      EndSelect
  EndSelect
  
Until Event = #PB_Event_CloseWindow
Gruss ... Velindos

Re: Linie zeichnen

Verfasst: 30.06.2011 13:41
von STARGÅTE
Dein Beispiel funktioniert doch, wo ist jetzt deine Frage bzw. dein Problem?

Hinweis: Hier würde sich das CanvasGadget besser eignen.

Re: Linie zeichnen

Verfasst: 30.06.2011 13:45
von Velindos
Hallo Stargate, ja schon aber nicht so wie ich es wollte. Dh. ich will mit der linken Maustaste-Klick den Startpunkt festlegen und dann sollte die Linie sichtbar sein wenn ich die Maus bewege zum zweiten Punkt. Dort möchte ich mit einen Klick auf die linke Maustaste das Ende festlegen!

Gruss ... Velindos

Re: Linie zeichnen

Verfasst: 30.06.2011 14:12
von STARGÅTE
Hier mal ein Beispiel mit dem neuen CanvasGadget()

Code: Alles auswählen

Enumeration
	#Window
	#Gadget
	#Image
	#SaveImage
EndEnumeration

UsePNGImageDecoder()

OpenWindow(#Window, 0, 0, 512, 512, "Fenster", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
	CanvasGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))

Global ShowLine.i, Start.Point

CreateImage(#SaveImage, 512, 512)
StartDrawing(ImageOutput(#SaveImage))
	Box(0,0,512,512,$FFFFFF)
StopDrawing()
SetGadgetAttribute(#Gadget, #PB_Canvas_Image, #SaveImage)

Repeat
	
	Event = WaitWindowEvent()
	
	Select Event
			
		Case #PB_Event_CloseWindow
			End
			
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #Gadget
					Select EventType()
						Case #PB_EventType_LeftButtonDown
							ShowLine = #True
							Start\X = GetGadgetAttribute(#Gadget, #PB_Canvas_MouseX)
							Start\Y = GetGadgetAttribute(#Gadget, #PB_Canvas_MouseY)
						Case #PB_EventType_MouseMove
							If ShowLine
								StartDrawing(CanvasOutput(#Gadget))
									DrawImage(ImageID(#SaveImage), 0, 0)
									LineXY(GetGadgetAttribute(#Gadget, #PB_Canvas_MouseX), GetGadgetAttribute(#Gadget, #PB_Canvas_MouseY), Start\X, Start\Y, $000000)
								StopDrawing()
							EndIf
						Case #PB_EventType_LeftButtonUp
							ShowLine = #False
							StartDrawing(ImageOutput(#SaveImage))
								LineXY(GetGadgetAttribute(#Gadget, #PB_Canvas_MouseX), GetGadgetAttribute(#Gadget, #PB_Canvas_MouseY), Start\X, Start\Y, $000000)
							StopDrawing()
							SetGadgetAttribute(#Gadget, #PB_Canvas_Image, #SaveImage)
					EndSelect
			EndSelect
			
	EndSelect
	
ForEver

Re: Linie zeichnen

Verfasst: 30.06.2011 14:35
von Velindos
Danke, aber bei mir kommt die Meldung "CanvasGadget() ist keine Funktion..."
Gruss ... Velindos

Re: Linie zeichnen

Verfasst: 30.06.2011 14:48
von NicTheQuick
Velindos hat geschrieben:Danke, aber bei mir kommt die Meldung "CanvasGadget() ist keine Funktion..."
Gruss ... Velindos
Dann hast du nicht die neuste PB-Version. Er schrieb ja, dass sein Beispiel mit dem neuen CanvasGadget() funktioniere.


Aber mal was anderes. Der Code funktioniert bei mir auch nicht unter Linux. Natürlich hat erst mal die Structure 'Point' gefehlt, aber das war ja nicht das Problem.
Problematisch ist bei mir, dass der Aufruf

Code: Alles auswählen

SetGadgetAttribute(#Gadget, #PB_Canvas_Image, #SaveImage)
den hübschen Fehler
[ERROR] Ungültiger Speicherzugriff.
auswirft.
Und ja, ich habe alle Rückgabewerte geprüft. Fenster, CanvasGadget und Image werden erfolgreich erstellt.

Falls den Fehler hier schnell jemand bestätigen kann, gehe ich damit auch ins Bugforum.

Re: Linie zeichnen

Verfasst: 30.06.2011 15:32
von STARGÅTE
Ich bin im nachhinein sowieso etwas verwundert, das mein Code überhaupt funktioniert.
Denn ich bin mir nicht ganz sicher, ob die Zeichenoperationen direkt auf dem Image was angegeben gemacht werden, oder auf dem CanvasGadget selbst.

Das problem was ich nämlich habe ist: das mir GetGadgetAttribute(#Gadget, #PB_Canvas_Image) keine gültige Image-Nummer zurück gibt.

Muss mich damit noch mal näher auseinander setzen.

Re: Linie zeichnen

Verfasst: 30.06.2011 15:34
von Velindos
Hallo, danke für den Tip, habe aber nachgesehen, er hat doch PB 4.51 so wie ich?
Habe eine neue Variante mit #WM_LBUTTONDOWN, #WM_LBUTTONUP, #WM_MOUSEMOVE gefunden! Debug geht bei UP und MOVE, jedoch nicht bei DOWN, kann mir einer sagen warum nicht!
Läuft daher auch im Programm nicht!

Code: Alles auswählen

Enumeration
  #Window_main
EndEnumeration
;
Enumeration
  #Image_gadget
  #Button_Neu
  #Button_Speichern
  #RotstifImage
EndEnumeration

Structure Punkt
  x.l
  y.l
EndStructure

Global ShowLine.i, Start.Point, MausPos.Punkt

CreateImage(#RotstifImage, 650, 650)
StartDrawing(ImageOutput(#RotstifImage))
Box(0, 0 , 650, 650, RGB(255,255,0))
StopDrawing()

Procedure Open_Window_main()
  If OpenWindow(#Window_main, 0, 0, 667, 706, "Image Rotstift",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_main))
      ;ImageGadget(#Image_gadget, 40, 40, 520, 580, )
      ImageGadget(#Image_gadget, 9, 53, 650, 650, ImageID(#RotstifImage))

    EndIf
  EndIf
EndProcedure

Open_window_main()

Repeat
  EventID= WaitWindowEvent()
  Select EventID
      
    Case #PB_Event_CloseWindow:Break
      
    Case #WM_LBUTTONDOWN
      Debug "down"
      
    Case #WM_LBUTTONUP
      Debug "up"
      
    Case #WM_MOUSEMOVE
      Debug "move"
  EndSelect
  
  
Until Event = #PB_Event_CloseWindow
Gruss ... Velindos

Re: Linie zeichnen

Verfasst: 30.06.2011 15:40
von bobobo
Das Imagegadget gehört dafür disablet
allerdings muss dann die mausposition besser gecheckt werden, da ja nur
im Bereich des Images gemalt werden soll

Re: Linie zeichnen

Verfasst: 30.06.2011 15:51
von bobobo
also der PB 4.6er Code von STARGÅTE mit ohne Canvas ginge dann so

Code: Alles auswählen

Enumeration
  #Window
  #Gadget
  #Image
  #SaveImage
EndEnumeration

OpenWindow(#Window, 0, 0, 512, 512, "Fenster", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window),0)
;CanvasGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
DisableGadget(#Gadget,1)
Global ShowLine.i, Start.Point

CreateImage(#SaveImage, 512, 512)
StartDrawing(ImageOutput(#SaveImage))
  Box(0,0,512,512,$FFFFFF)
StopDrawing()
CopyImage(#SaveImage,#Image)
SetGadgetState(#Gadget, ImageID(#Image))

Repeat
  
  Event = WaitWindowEvent()
  Debug event
  Select Event
      
    Case #PB_Event_CloseWindow
      End
      
      
    Case #WM_LBUTTONDOWN
      ShowLine = #True
      Start\X = WindowMouseX(#Window)
      Start\Y = WindowMouseY(#Window)
    Case #WM_MOUSEMOVE
      If ShowLine
        StartDrawing(ImageOutput(#Image))
          DrawImage(ImageID(#SaveImage), 0, 0)
          LineXY(WindowMouseX(#Window), WindowMouseY(#Window), Start\X, Start\Y, $000000)
        StopDrawing()
        SetGadgetState(#Gadget,ImageID(#Image))
      EndIf
    Case #WM_LBUTTONUP
      ShowLine = #False
      StartDrawing(ImageOutput(#SaveImage))
        LineXY(WindowMouseX(#Window),WindowMouseY(#Window), Start\X, Start\Y, $000000)
      StopDrawing()
      SetGadgetState(#Gadget,ImageID(#SaveImage))
      
  EndSelect
  
ForEver