我试图能够选择,垂直移动和下降2个不同的矩形(可能得到他们的位置,但这是一个问题,另一天)。
这里的代码,我设法把一个形状,但我不能找到一种方法,使它能够执行的行动,通过点击一个不影响其他。
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
public partial class Form1 : Form
{
Rectangle topMarker = new Rectangle(50, 125, 50, 2);
Rectangle bottomMarker = new Rectangle(50, 200, 50, 2);
bool isMouseDown = false;
public Form1()
{
InitializeComponent();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(new SolidBrush(Color.Green), topMarker);
e.Graphics.FillRectangle(new SolidBrush(Color.Red), bottomMarker);
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
isMouseDown = true;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown == true)
{
topMarker.Location = e.Location;
topMarker.X = 50;
if (topMarker.Y < 0)
{
topMarker.Y = 0;
}
if (topMarker.Y > pictureBox1.Height)
{
topMarker.Y = pictureBox1.Height - topMarker.Height;
}
Refresh();
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
isMouseDown = false;
}
}
1条答案
按热度按时间oaxa6hgo1#
我建议创建一个类对象来描述你的形状。
当您需要与这些对象中的一个对象进行交互时,这些对象的集合更容易处理。
在我看来,类对象应该实现一个接口,允许调用方法并使用所有形状所共有的属性(假设您可以添加不同的形状,而不仅仅是矩形)。
在这里的示例中,Marker类对象实现了一个IShape接口,该接口定义了所有对象必须公开的方法和属性。
它还实现了IDisposable,因为它以GraphicsPath的形式保存非托管资源。记住在Form关闭时对集合的所有元素调用
Dispose()
。Move()
方法允许指定偏移量(与前一个位置的差值)来移动形状。Draw()
方法接受一个Graphics
对象作为参数,你只需要传递e.Graphics
对象,该对象由绘制形状的画布的Paint
事件的PaintEventArgs
提供。标记在此设备上下文中绘制自身。IsMouseOver()
返回true或false。它使用GraphicsPath的IsVisible属性为了避免在拖动时 * 丢失 * 形状(因为鼠标指针可能会移动到它的边界之外),当其中一个Marker对象接收到单击事件时,我们预定义一个 * 选定的形状 *,并存储指针的当前位置。然后在移动鼠标时提前更新。当前选定的形状也会更新(请参见
mouseTrackLocation
和selectedMarker
字段)这就是它的全部,除了你可以添加一些 tolerance 到代码中来识别鼠标指针下的形状(可以用一些不可见的内容来 * 膨胀 * GraphicsPath)
注意:此代码假设您的目标是.NET 6+并启用了nullable。如果不是这种情况,只需将
using
块中的所有object?
声明更改为object
和using
Marker类和IShape接口:
它是这样工作的: