【问题标题】:Assign event to custom drawn shape将事件分配给自定义绘制的形状
【发布时间】:2014-08-04 08:38:48
【问题描述】:

我如何一条线并为其分配事件?我想绘制一个自定义形状,但它应该像普通控件一样,并且具有属性和事件。例如:

button1_Click(object sender, EventArgs e)
{
    DrawLine(width, height, location, location, color, panelToDrawShapeOn, nameThisShape);
}

nameThisShape_Click(object sender, EventArgs e)
{
    MessageBox.Show("Click event raised.");
}

private void DrawLine(int width, int height, int location, int location, Color color, Panel panel, string controlName)
{
    // Code to draw shape and setup events for it.
}

确认一下,我确实知道如何使用 GDI+ 绘制形状,但问题是,它们是静态的,我无法与它们“交互”,没有多少搜索让我找到了正确的地方如何与我绘制的形状进行交互。

【问题讨论】:

  • 直接的解决方案是实际使用控件。如果你想要一个更轻量级的解决方案,你将不得不做很多额外的工作,尤其是在规划方面;这些“虚拟控件”或“绘制对象”必须共享其父图形;您将必须找到一种方法来测试它们的列表,注意 z 顺序等。可能,但不是一件小事..

标签: c# .net winforms drawing gdi


【解决方案1】:

您将无法像处理控件那样处理自定义绘制的形状。如您所见,GDI+ 是immediate mode graphics system (as opposed a retained mode system)。这意味着,如果您想要渲染一个充满形状的持久场景图,您需要自己创建和管理它。然后,您将感兴趣的事件挂接到作为绘图目标的控件上,并通过对可渲染对象列表进行命中测试来处理它们(例如,查找鼠标悬停的形状(如果有的话))。

编写该代码可能需要大量工作,但您可以找到可以帮助您的库。例如,在我的一个工作项目中,我们使用了一个名为JTS 的计算几何库来进行几何表示和命中测试代码。如果您想避免使用第三方库,您可以通过 Region 类获得其中的一部分,这至少可以为您提供命中测试。

【讨论】:

  • 除了Region,看看GraphicsPath.可能会有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
相关资源
最近更新 更多