2012-02-09 18 views
5

Download the projectLàm thế nào để Thực hiện một công cụ Selection Tool Trong C#

tôi đang cố gắng để tạo ra một bảng với một màu nền mà sẽ có thể được rút ra trong thời gian chạy khi người dùng giữ nút chuột trái và di chuyển nó xung quanh. Tất cả các công trình tìm thấy khi người dùng bắt đầu từ trên cùng bên trái và đi xuống dưới cùng bên phải giống như hình ảnh hiển thị:

Nhưng tôi muốn người dùng có thể tạo bảng điều khiển từ dưới lên trên cùng bên trái. Cũng giống như khi bạn chọn một cái gì đó trên máy tính của bạn với con chuột của bạn

Le Image

Đây là mã của tôi bây giờ:

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(); 
    } 
} 

Tôi nghĩ rằng đây là nơi tôi đi sai, và tôi chỉ đơn giản là không thể tìm đúng thuật toán cho nó:

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

Nhưng nếu tôi sử dụng hình chữ nhật thì nó hoạt động tốt, nhưng tôi cũng muốn bảng điều khiển của tôi có thể làm điều đó.

+1

Ngay lập tức nhấn câu hỏi : bạn đang cố gắng thực hiện một chương trình vẽ? – Ryan

+0

không. chỉ cần cố gắng để thực hiện một điều khiển lựa chọn :) – chrs

+0

Việc lựa chọn sẽ được phía sau hoặc phía trên các điều khiển khác? – Ryan

Trả lời

3

Bạn chỉ cần kiểm tra mức tối thiểu và tối đa của điểm xuất phát so với điểm di chuột của bạn. Vấn đề với mã là bạn đang sử dụng vị trí kiểm soát làm điểm bắt đầu, nhưng nếu bạn di chuyển chuột từ dưới cùng bên phải sang trên cùng bên trái, vị trí của bạn cần phải thay đổi. Điều khiển không thể có kích thước âm.

Dưới đây là cách tôi đã viết lại nó (tôi loại bỏ những thứ không cần thiết để thử nghiệm):

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; 
    } 
} 

Đây là mã tôi đã sử dụng để thử nghiệm nó trên một hình thức:

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 tốt hơn nhiều so với giải pháp của tôi. +1 (Tôi sẽ xóa của tôi bởi vì tôi không muốn mọi người sử dụng tôi như một ví dụ, khi họ thực sự nên sử dụng điều này.) – Zenexer

Các vấn đề liên quan