2012-02-09 10 views
5

Download the projectCome fare uno strumento di selezione In C#

Sto cercando di fare un pannello con un colore di sfondo, che dovrebbe essere in grado di trarre in runtime quando l'utente tiene premuto il pulsante sinistro del mouse e sposta in giro. Tutte le opere trovano quando l'utente è a partire da in alto a sinistra e andare a in basso a destra, proprio come l'immagine mostra:

ma voglio che l'utente sia in grado di rendere il pannello da basso a destra in alto a sinistra. Proprio come quando si seleziona qualcosa sul vostro computer con il mouse

Le Image

Ecco il mio codice per ora:

public void parent_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
    Point tempLoc = e.Location; 
    this.Location = new Point 
    (
     Math.Min(this.Location.X, tempLoc.X), 
     Math.Min(this.Location.Y, tempLoc.Y) 
    ); 

    this.Size = new Size 
    (
     Math.Abs(this.Location.X - tempLoc.X), 
     Math.Abs(this.Location.Y - tempLoc.Y) 
    ); 

    this.Invalidate(); 
    } 
} 

penso che questo è il posto dove ho sbagliato, e io semplicemente non posso trovare l'algoritmo giusto per esso:

this.Size = new Size 
(
    Math.Abs(this.Location.X - tempLoc.X), 
    Math.Abs(this.Location.Y - tempLoc.Y) 
); 

ma se io uso un rettangolo che funziona benissimo, ma io voglio che il mio pannello di essere in grado di farlo pure.

+1

immediatamente premendo domanda : stai cercando di fare un programma di disegno? – Ryan

+0

no. solo cercando di effettuare un controllo di selezione :) – chrs

+0

La selezione sarà dietro o sopra gli altri controlli? – Ryan

risposta

3

È sufficiente controllare i minimi e i massimi del punto di partenza rispetto al punto di riferimento. Il problema con il codice è che stai usando la postazione di controllo come punto di partenza, ma se sposti il ​​mouse dall'angolo in basso a destra a quello in alto a sinistra, la tua posizione deve cambiare. Un controllo non può avere una dimensione negativa.

Ecco come ho ri-scritto (ho rimosso cose inutili per la prova):

public class SelectionTool : Panel { 
    Form parent; 
    Point _StartingPoint; 

    public SelectionTool(Form parent, Point startingPoint) { 
    this.DoubleBuffered = true; 
    this.Location = startingPoint; 

    //this.endingPoint = startingPoint; 
    _StartingPoint = startingPoint; 

    this.parent = parent; 
    this.parent.Controls.Add(this); 
    this.parent.MouseMove += new MouseEventHandler(parent_MouseMove); 
    this.BringToFront(); 
    this.Size = new Size(0, 0); 
    } 

    public void parent_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
     int minX = Math.Min(e.Location.X, _StartingPoint.X); 
     int minY = Math.Min(e.Location.Y, _StartingPoint.Y); 
     int maxX = Math.Max(e.Location.X, _StartingPoint.X); 
     int maxY = Math.Max(e.Location.Y, _StartingPoint.Y); 
     this.SetBounds(minX, minY, maxX - minX, maxY - minY); 

     this.Invalidate(); 
    } 
    } 

    protected override void OnPaint(PaintEventArgs e) { 
    base.OnPaint(e); 
    this.BackColor = Color.Blue; 
    } 
} 

Ecco il codice che ho usato per testare in un modulo:

private SelectionTool _SelectPanel = null; 

private void Form1_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) { 
    if (_SelectPanel == null) 
     _SelectPanel = new SelectionTool(this, e.Location); 
    } 
} 

private void Form1_MouseUp(object sender, MouseEventArgs e) { 
    if (_SelectPanel != null) { 
    _SelectPanel.Dispose(); 
    _SelectPanel = null; 
    } 
} 
+1

Haha molto meglio della mia soluzione. +1 (Ho intenzione di cancellare il mio perché non voglio che le persone usino il mio come esempio, quando dovrebbero davvero usarlo.) – Zenexer

Problemi correlati