2014-06-13 30 views
0

我如何绘制一条线并将事件分配给它?我想绘制一个自定义的形状,但它应该像一个正常的控制,并具有属性和事件。例如:将事件分配给自定义绘制形状

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 +绘制形状,但问题是,他们是静态的,我不能“互动”和他们在一起,也没有搜索量,导致我找出如何与我绘制的形状进行交互的正确位置。

+0

直接的解决方案是实际使用控件。如果你想要一个更轻量级的解决方案,你将不得不做很多额外的工作,特别是在规划中;这些'虚拟控制'或'绘制对象'将不得不分享他们父母的图形;你将不得不找到一种方法来测试它们的列表,关心z-order等。可能,但不是小的壮举。 – TaW

回答

1

您将无法像处理控件一样处理自定义绘制的形状。正如你所发现的,GDI +是一个immediate mode graphics system (as opposed a retained mode system)。这意味着如果你想要一个充满形状的永久性场景图形被渲染,你需要自己创建和管理它。然后,您可以将感兴趣的事件绑定到作为绘图目标的控件上,并通过对可渲染对象列表执行命中测试(例如,查找鼠标何时结束)来处理它们。

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

+0

除了'Region',它可能有助于查看'GraphicsPath.' – TaW