Trong chương trình .net C# của tôi, tôi vẽ vài dòng bằng cách sử dụng các giá trị từ các hộp văn bản (tôi sử dụng hàm DrawLine). Tôi muốn có thể di chuyển một trong những dòng này bằng cách bấm vào nó và di chuyển dòng này bằng chuột - có thể không?Graphic - DrawLine - vẽ đường và di chuyển nó
9
A
Trả lời
37
public class LineMover : Form
{
public LineMover()
{
this.DoubleBuffered = true;
this.Paint += new PaintEventHandler(LineMover_Paint);
this.MouseMove += new MouseEventHandler(LineMover_MouseMove);
this.MouseDown += new MouseEventHandler(LineMover_MouseDown);
this.MouseUp += new MouseEventHandler(LineMover_MouseUp);
this.Lines = new List<GraphLine>()
{
new GraphLine (10, 10, 100, 200),
new GraphLine (10, 150, 120, 40),
};
}
void LineMover_MouseUp(object sender, MouseEventArgs e)
{
if (Moving != null)
{
this.Capture = false;
Moving = null;
}
RefreshLineSelection(e.Location);
}
void LineMover_MouseDown(object sender, MouseEventArgs e)
{
RefreshLineSelection(e.Location);
if (this.SelectedLine != null && Moving == null)
{
this.Capture = true;
Moving = new MoveInfo
{
Line = this.SelectedLine,
StartLinePoint = SelectedLine.StartPoint,
EndLinePoint = SelectedLine.EndPoint,
StartMoveMousePoint = e.Location
};
}
RefreshLineSelection(e.Location);
}
void LineMover_Paint(object sender, PaintEventArgs e)
{
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
foreach (var line in Lines)
{
var color = line == SelectedLine ? Color.Red : Color.Black;
var pen = new Pen(color, 2);
e.Graphics.DrawLine(pen, line.StartPoint, line.EndPoint);
}
}
void LineMover_MouseMove(object sender, MouseEventArgs e)
{
if (Moving != null)
{
Moving.Line.StartPoint = new PointF(Moving.StartLinePoint.X + e.X - Moving.StartMoveMousePoint.X, Moving.StartLinePoint.Y + e.Y - Moving.StartMoveMousePoint.Y);
Moving.Line.EndPoint = new PointF(Moving.EndLinePoint.X + e.X - Moving.StartMoveMousePoint.X, Moving.EndLinePoint.Y + e.Y - Moving.StartMoveMousePoint.Y);
}
RefreshLineSelection(e.Location);
}
private void RefreshLineSelection(Point point)
{
var selectedLine = FindLineByPoint(Lines, point);
if (selectedLine != this.SelectedLine)
{
this.SelectedLine = selectedLine;
this.Invalidate();
}
if (Moving != null)
this.Invalidate();
this.Cursor =
Moving != null ? Cursors.Hand :
SelectedLine != null ? Cursors.SizeAll :
Cursors.Default;
}
public List<GraphLine> Lines = new List<GraphLine>();
GraphLine SelectedLine = null;
MoveInfo Moving = null;
static GraphLine FindLineByPoint(List<GraphLine> lines, Point p)
{
var size = 10;
var buffer = new Bitmap(size * 2, size * 2);
foreach (var line in lines)
{
//draw each line on small region around current point p and check pixel in point p
using (var g = Graphics.FromImage(buffer))
{
g.Clear(Color.Black);
g.DrawLine(new Pen(Color.Green, 3), line.StartPoint.X - p.X + size, line.StartPoint.Y - p.Y + size, line.EndPoint.X - p.X + size, line.EndPoint.Y - p.Y + size);
}
if (buffer.GetPixel(size, size).ToArgb() != Color.Black.ToArgb())
return line;
}
return null;
}
public static void Main()
{
Application.Run(new LineMover());
}
}
public class MoveInfo
{
public GraphLine Line;
public PointF StartLinePoint;
public PointF EndLinePoint;
public Point StartMoveMousePoint;
}
public class GraphLine
{
public GraphLine(float x1, float y1, float x2, float y2)
{
this.StartPoint = new PointF(x1, y1);
this.EndPoint = new PointF(x2, y2);
}
public PointF StartPoint;
public PointF EndPoint;
}
Các vấn đề liên quan
- 1. Vẽ đường kẻ và di chuyển nó theo chương trình
- 2. Vẽ một đường đậm với DrawLine() khi mở rộng Canvas
- 3. C++ Graphic Drawing Library
- 4. Android Canvas drawLine
- 5. Android - Canvas drawLine bên trong ImageView
- 6. Di chuyển mô hình đường ray sau khi di chuyển
- 7. đường ray chạy di chuyển cụ thể
- 8. C# thay thế di chuyển đường ray
- 9. Di chuyển: nó sẽ làm gì?
- 10. Vẽ đường kết nối trong RaphaelJS
- 11. QPainter :: drawLine và QPainter :: drawText với vấn đề màu sắc khác nhau trong Qt
- 12. Lấy SQL từ Di chuyển Đường ray
- 13. Di chuyển đường ray - change_column với loại chuyển đổi
- 14. Làm thế nào để vẽ một đường với Cocos2d-iPhone
- 15. Cách lưu và tải đường vẽ iphone SDK
- 16. Vẽ các đường bằng Thuật toán Đường dây của Bresenham
- 17. KineticJS - Vẽ các đường bằng chuột
- 18. Vẽ hình chữ nhật bằng cách nhấp chuột, di chuyển chuột và nhấp vào
- 19. Cuộn lùi tất cả các đường di chuyển hoặc thả bảng và sửa đổi di chuyển (bắt đầu từ đầu)
- 20. Cách vẽ và di chuyển hình dạng bằng chuột trong C#
- 21. Di chuyển đường ray: cách tốt nhất để truy xuất phiên bản di chuyển hiện tại
- 22. làm cách nào để vẽ một đường trên hình ảnh?
- 23. Richtextbox vẽ đường rtf
- 24. Đường dẫn vẽ Android
- 25. Vẽ đường lắp (OpenCV)
- 26. Đường bay Maven init trước khi di chuyển
- 27. Đường ray - Tạo tập lệnh di chuyển từ mô hình
- 28. Xóa các đường kẻ được vẽ trước đây trên canvas HTML5
- 29. Thay đổi Sprite Anchorpoint mà không cần di chuyển nó?
- 30. Kích hoạt URL neo nhưng không di chuyển đến nó?
Tất nhiên đó là có thể. Chắc chắn bạn có thể nghĩ ra một câu hỏi hay hơn? –
Vậy làm thế nào để làm điều này? :) Tôi có một cái gì đó tương tự như thế này http://www.youtube.com/watch?v=EiByTu7aa0k và tôi muốn bấm vào một trong những dòng này và hange vị trí của nó – Juss
Vâng, những gì bạn đã làm cho đến nay? Bạn có ít nhất tạo một danh sách các dòng và bạn đã viết trình xử lý sự kiện MouseDown để kiểm tra xem người dùng đã nhấp vào một dòng chưa? Bạn bị kẹt ở đâu? –