.net C# programımda metin kutularından değerler kullanarak az çizgi çiziyorum (DrawLine işlevini kullanıyorum). Bu satırlardan birini clik ile hareket ettirmek ve bu çizgiyi fareyle hareket ettirmek istiyorum - bu mümkün mü? mümkün ElbetteGrafik - DrawLine - çizgiyi çizin ve taşıyın
9
A
cevap
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;
}
İlgili konular
- 1. grafik çizin
- 2. Android Canvas drawLine
- 3. Birkaç grafik üzerinde bir çizgiyi çizme
- 4. Bir Arc ve degrade çizin
- 5. Yapıcıları ve devralmayı taşıyın
- 6. Android - Canvas drawLine içinde ImageView
- 7. Bitmap yükleyin veya grafik çizin mi? Performans Sorusu
- 8. Tek grafikte iki grafik çizin. işlev çizgileri çalışmıyor
- 9. Anlambilim ve const başvuruları taşıyın
- 10. Açılır menüden ve/veya radyo düğmesi değişikliğinden yeni değişken seçiminde yeni grafik çizin
- 11. Çizgiyi bağımsız olarak temizleyin ve temizleyin
- 12. Intrinsics'in etkisi ve Lambda'nın performansındaki çizgiyi?
- 13. eksen etiketleri taşıyın ggplot
- 14. Hücre büyüklüklerini hesaplayın ve çizin (aralarında çizgilerle).
- 15. VB.NET ile fareyi programa tıklayın ve taşıyın
- 16. WebPack 2: PreLoaders ve PostLoader'ları taşıyın
- 17. Alan yineleniyorsa çizgiyi kaldırın
- 18. FQL ve Grafik API'si
- 19. 2014b'de 2013b'de kaydedilen bir rakamı yeniden çizin
- 20. Görüntü Üzerine Dikdörtgen çizin
- 21. Oluşturucu Taşıyın, std :: move kullanarak vektörü iki nesne arasında taşıyın.
- 22. Masaüstünde/doğrudan üstünde çizin?
- 23. Küresel istisnaları VB'ye taşıyın
- 24. Uygulamayı telefona taşıyın
- 25. Nesneyi oynatıcıya taşıyın
- 26. Pygame: Tekil piksel çizin
- 27. Yalnızca XAML kullanarak düz renk üçgeni çizin
- 28. Bir resimdeki çizgiyi izleme MATLAB
- 29. Vim'deki bir çizgiyi nasıl değiştirirsiniz?
- 30. Apple Watch`s Activity uygulaması - daireler çizin?
. Elbette daha iyi bir soru düşünebilir misin? –
Peki bu nasıl yapılır? :) Bu http://www.youtube.com/watch?v=EiByTu7aa0k gibi bir şeye benziyorum ve bu satırlardan birine tıklayıp konumunu sabitlemek istiyorum – Juss
Peki, şu ana kadar ne yaptın? En azından bir satır listesi oluşturdunuz ve kullanıcının bir satıra tıklayıp tıklamadığını kontrol etmek için bir MouseDown olay işleyicisi yazdınız mı? Tam olarak nereye takıldın? –