Linie zeichnen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Linie zeichnen

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Linie zeichnen

Beitrag von STARGÅTE »

Dein Beispiel funktioniert doch, wo ist jetzt deine Frage bzw. dein Problem?

Hinweis: Hier würde sich das CanvasGadget besser eignen.
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
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Linie zeichnen

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Linie zeichnen

Beitrag 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
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
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Linie zeichnen

Beitrag von Velindos »

Danke, aber bei mir kommt die Meldung "CanvasGadget() ist keine Funktion..."
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Linie zeichnen

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Linie zeichnen

Beitrag 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.
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
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Linie zeichnen

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Linie zeichnen

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Linie zeichnen

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten