Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Bildbereiche auswählen/Auswahl zeichnen

  Alt 4. Aug 2006, 12:28
Hi,
was genau ist denn das woran du scheiterst? Ich meine klar, du hast erklärt was du machen möchtest, wofür fehlt genau der Ansatz?
Das markieren kannst du über die Mausereignisse OnMouseDown, OnMouseMove und OnMouseUp vornehmen.
Mit dem OnMouseDown musst du halt schauen welche Aktion durchgeführt werden soll. Der Einfachheit halber nehmen wir hier einfach mal an, dass du eine rechteckige Auswahl treffen möchtest. Du merkst dir nun einfach die Mauskoordinaten (die bekommst du von der Ereignisbehandlung gleich geliefert). Wird die Maus nun bewegt, kannst du die Größe des Rechtecks anpassen. Das OnMouseMove liefert die die aktuellen Mauskoordinaten, du musst nur dafür sorgen, dass ein Rechteck von den alten Koordinaten (die du dir merkst) zu den nun aktuellen gezeichnet wird. Da zeichnen auf dem Canvas dir deinen eigentlichen Hintergrund überzeichnen würde (und das willst du ja nicht), kannst du einfach den Mode (des Stifts) auf pmXOR setzen. Zeichnest du zweimal an der gleichen Stelle, so ist das alte unveränderte Bild zu sehen.
Im OnMouseUp kannst du dann das zeichnen beenden und kennst die Auswahl.

Also einfach gesagt:
OnMouseDown -> Merken der StartKoordinaten + Pen.Mode := pmXOR

OnMouseMove -> Letztes gezeichnetes Rechteck erneut zeichnen (löscht es wegen pmXOR), Rechteck von StartKoordinaten zu den aktuellen Koordinaten zeichnen, die aktuellen Koordinaten speichern (damit Rechteck mittel XOR wieder gelöscht werden kann)

OnMouseUp -> Endkoordinaten merken, fertig!

Gruß Der Unwissende

[ADD]
Toll, hättest du früher sagen können
[/ADD]

[ANTWORT NACH ROTEM KASTEN]

Zitat von CK_CK:
Edit: Es geht natürlich nicht vorrangig darum, die Auswahl zu zeichnen, sondern eher darum, diese zu speichern, und mit ihr weiterzuarbeiten, und das Ursprungsbild immernoch im Hintergrund zu haben (Auswahl entfernen->normales Bild ist wieder da)
Ja, bleibt für mich die Frage was genau du wissen möchtest. An sich hast du ja irgendein Format, z.B. ein Bitmap. Diese kannst du natürlich in einem TBitmap Objekt speichern. An sich ist das denke ich grob der Weg den du wählen musst. Du hälst das Original in einem Objekt. Mit den Ausschnitten tust du im Prinzip nichts anderes. Alles was du anzeigen kannst ist letztlich immer eine rechteckige Bitmap (mehr oder weniger korrekt). Jedenfalls kannst du auch wenn du eine Ellipse auswählst zu dieser einfach das umgebende Rechteck berechnen. Nun erzeugst du eine leere Bitmap in der entsprechenden Größe und kopierst deinen Ausschnitt hier rein (der Hintergrund der Bitmap sollte also transparent sein). Das war's eigentlich schon.
Wird nun die Auswahl gelöscht, gibst du die Instanz im Speicher wieder frei und holst die andere TBitmap (mit dem Original) zurück.
Ich denke nicht, dass das wirklich das ist, was du wissen möchtest. Von daher noch mal die Bitte, sag doch was genau der Schritt ist an dem du scheiterst.

Deine Formulierung ist halt sehr allgemein. Ich denke nicht, dass sich jmd. die Überlegungen zu deinem Programm machen wird. Also wenn du etwas genauer sagen könntest woran exakt du scheiterst. Ich meine wie geht's weiter ist keine gute Frage (sorry).
An sich gibt es halt viele Ansätze wie man das machen könnte, aber es kommt darauf an was du damit machen möchtest.
  Mit Zitat antworten Zitat