realbasic-nug.de
[Top] [All Lists]

Re: Linie zeichnen und verschieben

To: REALbasic NUG German <realbasic-nug dot de at lists dot realsoftware dot com>
Subject: Re: Linie zeichnen und verschieben
From: Christiaan Verbree <v at vmac dot ch>
Date: Mon, 30 May 2005 21:50:14 +0200
Delivered-to: realbasic-nug dot de at lists dot realsoftware dot com
References: <4f5a58e51d50de13a6fe1bf308bd8f1d at nessisoft dot de>

Am 30.05.2005 um 20:21 schrieb Norbert Kraemer:

Hallo,

ich möchte eine Linie zeichnen und anschließend irgendwie verschieben können. Dazu habe ich in mein Fenster ein Canvas und einen Slider eingebaut und in den ValueChanged-Event des Sliders folgendes geschrieben:

canvas1.graphics.drawline(10,me.value,200,me.value)

Die Linie wird bloß nicht verschoben, sondern immer eine neue gezeichnet.

So einfach geht das nicht, du musst die Linie an der alten Postion zuerst löschen und dann eine neue an der neuen Position zeichen.

Am einfachsten geht das, wenn du dir eine eigene Klasse von Typ Canvas erstellst. Dann kannst du in dieser Klasse über vier Propertys die Linie definieren, speichern an welcher Position sie ist.

Im Paintevent der Klasse schreibst du jetzt folgenden code:

'Alles löschen:
g.clearRect(0,0,g.width,g.height)

'Linie neu zeichen:
g.drawLine(x1,y1,x2,y2)

Wenn du die Linie verschieben willst, veränderst du die x1 oder y1 und y2 werte und rufst dann die Refresh Methode deines Canves aus:

meinCanvas.refresh

Zusatzfrage: Kann man die Linie auch mit der Maus draggen, wie das in einem objektorientierten Zeichenprogramm möglich ist?

Das geht auch, dazu musst du im MouseDown Event der Klasse eine "Kollisionsabfrage" machen, der Event übergibt dir die X und Y Koordinaten wo man mit der Maus geklickt hat, jetzt musst du vergleichen ob mit der Maus auf deine Linie geklickt wurde.

Um das ganze zu dragen musst du dann im MouseDown event true zurückgeben und mit dem MouseDrag Event arbeiten Beim return true bin ich mir jetzt nicht 100% sicher aber das sollte auch in der online Hilfe von RB stehen.

Ich hoffe das war so weit verständlich, der Code hier ist nur Beispielcode und er ist nicht besonders Geschwindigkeitsoptimiert (und unter Windows wird das ganze noch Flackern).

gruss V

<Prev in Thread] Current Thread [Next in Thread>