![]() |
Canvas als Objekt?
Hallo Delphianer!
ich bin schon seid 2 Tagen vergebens auf der Suche für mein Problem. Es geht um folgendes: Ich habe auf einem Panel/painbox (was auch immer) beliebig viele 1px breite Linien. • Die Linien können sich natürlich auch überschneiden. • Die Linien können in jedem beliebigen Winkel gemalt sein Jetzt kommt der schwierige Teil: Die Linien müssen anwählbar sein, d.h bei Mausklick reagieren. Ich habe ja schon versucht über Shapes das Teil zu realisieren aber leider bekomme ich bei Shapes auch ein Klick Event auch wenn der Part eigentlich "transparent" ist. Ist dies über Canvas möglich, das Problem da bei ist ja das meine Linie in keinster Weise ansprechbar sind. Auch über die Hintergrundfarbe der Aktuellen Mausposition habe ich schon versucht aber woher weiß ich welche Linie ich jetzt geklickt habe... Habe leider keine Idee mehr, vielleicht kann mir ja jemand aus dem tollem Forum weiterhelfen. Danke schonmal für alle Antworten. mfg r |
Re: Canvas als Objekt?
HY Robert!
Das hat nix mit TCanvas zu tun. Das ist nur ein Wrapper, der die wichtigsten GDI Funktionen kapselt. Das ist vielmehr eine gute Gelegenheit, objektorientiertes Programmieren zu lernen. Erstelle Dir eine Klasse TLinie abgeleitet von TObject, die die Koordinaten enthält. Dann brauchst Du ne public Methode HitTest, der Du die Mausposition relativ zu Deiner Zeichenfläche übergibst. Darin testet Du ob der Punkt auf Deiner Linie liegt. Ist das er Fall, wird ein Flag Select gesetzt. Jetzt noch ein dynamisches Array, das beliebig viele Linienobjekte speichern kann und alles ist gut, eventuell ne Containerklasse drumherum mit AddLinie, DeleteLinie, Repaint, etc. Beim Zeichnen berücksichtigst Du dann Select-Flag und stellst die betreffende Linie z. B. in ner anderen Farbe dar. So kannst Du auch noch andere geometrische Figuren kapseln, wenn Du alle von einer Basisklasse ableitest ... bla bla bla Viel Spass OLLI |
Re: Canvas als Objekt?
Wie OLLI_T es sagte, würde auch ich in folgende Richtung marschieren:
Delphi-Quellcode:
Du verwaltest eine TList mit TMyLine-Objekten. Immer wenn Eine neue Linie dazukommt, erweiterst Du die TList um ein solches Element.
TMyLineCoord = Record
Start : TPoint; Ende : TPoint; end; TMyLine = class(TObject) private FCoord : TMyLineCoord; protected public property Koordinaten : TMyLineCoord read FCoord write FCoord ; procedure DrawAtCanvas(DerCanvas: TCanvas; DerPen : TPen); function IstDasDeinPunkt(DerPunkt : TPoint):Boolean; constructor CreateIt; destructor Destroy; override; published end; implementation constructor TMyLine.CreateIt; begin inherited Create; FCoord.Start.x := 0; FCoord.Start.y := 0; FCoord.Ende .x := 0; FCoord.Ende .y := 0; end; destructor TMyLine.Destroy; begin inherited; end; procedure TMyLine.DrawAtCanvas(DerCanvas: TCanvas; DerPen : TPen); var TempPen : TPen; begin TempPen := DerCanvas.Pen; DerCanvas.Pen := DerPen; DerCanvas.MoveTo(FCoord.Start.x,FCoord.Start.y); DerCanvas.LineTo(FCoord.Ende.x,FCoord.Ende.y); DerCanvas.Pen := TempPen; end; function TMyLine.IstDasDeinPunkt(DerPunkt: TPoint): Boolean; begin Result := DenkDirSelberAusWieDuPrüfstObDerPunktAufDerLinieLiegt; end; In dem Onclickereignis Deiner Canvas-Componente gehst Du die Liste Durch und Chckst ob der Punkt draufliegt:
Delphi-Quellcode:
function GetLineUnderPoint(DerPunkt:TPoint):Integer;
var i : Integer; begin Result := -1; for i := 0 to FMeineLinienListe.Count-1 do begin if TMyLine(FMeineLinienListe[i]).IstDasDeinPunkt(DerPunkt) then begin Result := i; Break; end; end; end; |
Re: Canvas als Objekt?
WOW Leuselator!
Da hast Du Dir aber echt Mühe gemacht. Gibt es sowas in der Art schon in der Library? Wäre sicher einen Eintrag wert. Viele Grüsse + schönes WE :hi: OLLI |
Re: Canvas als Objekt?
Ich habe es jetzt gelöst, zwar anders aber trotzdem danke.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz