1 回答
TA贡献1966条经验 获得超4个赞
示例代码:
两个类级变量和一个辅助函数:
List<Point> dots = new List<Point>();
int dotSize = 12;
Rectangle fromPoint(Point pt, int size)
{
return new Rectangle(pt.X - size/ 2, pt.Y - size / 2, size, size);
}
mouseclick(与 click 事件相反)包含位置:
private void Pbxkarte_MouseClick(object sender, MouseEventArgs e)
{
if (!dots.Contains(e.Location))
{
dots.Add(e.Location);
Pbxkarte.Invalidate(); // show the dots
}
}
您可以添加代码来删除点或更改属性,尤其是。如果您创建一个点类。- 如果您想避免重叠点,您可以使用类似于 mousemove 中的代码来检测这一点。但。不要重复代码!相反,分解出一个boolOrPoint IsDotAt(Point)可以两次使用的函数!
在鼠标移动中我只显示点击状态。你做你的事..
private void Pbxkarte_MouseMove(object sender, MouseEventArgs e)
{
bool hit = false;
foreach (var dot in dots)
{
using (GraphicsPath gp = new GraphicsPath())
{
gp.AddEllipse(fromPoint(dot, dotSize));
if (gp.IsVisible(e.Location))
{
hit = true; break;
}
}
}
Cursor = hit ? Cursors.Hand : Cursors.Default;
}
每当列表中或系统中发生任何更改时,列表中的所有点都必须显示。:
private void Pbxkarte_Paint(object sender, PaintEventArgs e)
{
foreach (var dot in dots)
{
using (GraphicsPath gp = new GraphicsPath())
{
gp.AddEllipse(fromPoint(dot, dotSize));
e.Graphics.FillPath(Brushes.Red, gp);
}
}
}
如果您想要更多属性,例如文本或颜色,请创建class dot并使用List<dot>!
- 1 回答
- 0 关注
- 114 浏览
添加回答
举报