myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Rubberband
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Rubberband

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.290


ErfinderDesRades ist offline

Rubberband

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Kleines Snippet, wie man mit ControlPaint.DrawReversibleFrame() so Auswahlrechtecke implementieren kann.
Funktioniert gut, aber nur auf unbewegten Untergründen.
Wird der ReversibleFrame dagegen durch andere Zeichenvorgänge übermalt, kommts quasi zu "Fehlbildungen".

C#-Code:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace nsRubberband {
   /* Prinzip mit ControlPaint.DrawReversibleFrame(): einmal Zeichnen - machts sichtbar.
    * Exakt noch mal drüber zeichnen: isses wieder weg
    * Hier wird übrigens kein Event geraist - der Aufrufer muß selbst im _MouseUp die
    * Rubberband.Rectangle-Property abfragen
    */


   public class Rubberband {

      private Rectangle _Rectangle;
      private Size _anchor;

      public Rectangle Rectangle {
         get {
            Rectangle rct = _Rectangle;
            // DrawReversibleFrame verarbeitet zwar auch Rechtecke mit negativer Breite oder Höhe,
            // aber doch lieber umrechnen, weil GDI kanns z.B. nicht.
            if (rct.Width < 0) {
               rct.X += rct.Width;
               rct.Width *= -1;
            }
            if (rct.Height < 0) {
               rct.Y += rct.Height;
               rct.Height *= -1;
            }
            return rct;
         }
      }

      public void Start(object sender, MouseEventArgs e) {
         if (e.Button != MouseButtons.Left) throw new ArgumentException(
            "I only start when MouseButtons.Left is clicked!", "e.Button");
         _Rectangle = new Rectangle(Control.MousePosition, Size.Empty);
         _anchor = new Size(Rectangle.X, Rectangle.Y);
         ControlPaint.DrawReversibleFrame(Rectangle, Color.Yellow, FrameStyle.Thick); //erstmaliges Zeichnen
         Control ctl = (Control)sender;
         ctl.MouseMove += ctl_MouseMove;
         ctl.MouseUp += ctl_MouseUp;
      }

      void ctl_MouseMove(object sender, MouseEventArgs e) {
         ControlPaint.DrawReversibleFrame(Rectangle, Color.Yellow, FrameStyle.Thick); //löschen
         Point pt = Control.MousePosition;
         _Rectangle.Size = new Size(pt - _anchor);
         ControlPaint.DrawReversibleFrame(Rectangle, Color.Yellow, FrameStyle.Thick); //neuzeichnen
      }

      void ctl_MouseUp(object sender, MouseEventArgs e) {
         ControlPaint.DrawReversibleFrame(Rectangle, Color.Yellow, FrameStyle.Thick); //letztmaliges löschen
         Control ctl = (Control)sender;
         ctl.MouseMove -= ctl_MouseMove;
         ctl.MouseUp -= ctl_MouseUp;
      }
   }
}

Nachtrag: Gestartet wird im _MouseDown des Forms, und im MouseUp kann z.B. das Rectangle "abgeholt" werden.

Schlagwörter: Rubberband, Auswahlrechteck, auswahl


Dateianhang:
unknown Rubberband02.zip (12 KB, 592 mal heruntergeladen)

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von ErfinderDesRades am 07.04.2009 12:09.

Neuer Beitrag 07.04.2009 11:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Jahre.
Der letzte Beitrag ist älter als 11 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 18.09.2020 22:09