2

我有一些使用 DrawString 绘制的字符串

        for (int j = 0; j < dt.Rows.Count; j++)
        {
            e.Graphics.DrawString(Convert.ToString(dt.Rows[j]["ID"]), drawFont, drawBrush, new Point(Convert.ToInt32(dt.Rows[j]["XCord"]), Convert.ToInt32(dt.Rows[j]["YCord"])));
        }

有没有办法为每个拉绳创建一个 onclick 事件?当您单击拉绳时,我希望创建一个新表单。谢谢!

4

2 回答 2

1

不,当你用你渲染东西时,Graphics你不能将事件绑定到绘制的对象。

有两种解决方案,您可以在表单(MouseClick事件)上捕获鼠标点击并确定鼠标是否在渲染的字符串上(使用获取渲染区域MeasureString)。然而,这是不必要的困难和复杂。

相反,我建议在表单上动态生成一个控件。您可以生成一个Button,或者,如果您只喜欢表单上文本的样式,Label则可以将一个 EventHandler 绑定到他们的MouseClick事件。

于 2012-07-13T14:24:57.723 回答
1

处理MouseClick容器的事件并通过行枚举找出文本的“矩形”并查看鼠标位置是否在其中:

void panel1_MouseClick(object sender, MouseEventArgs e) {
  if (e.Button == MouseButtons.Left) {
    foreach (DataRow dr in dt.Rows) {
      Point p = new Point(Convert.ToInt32(dr["XCord"]), Convert.ToInt32(dr["YCord"]));
      Size s = TextRenderer.MeasureText(dr["ID"].ToString(), panel1.Font);
      if (new Rectangle(p, s).Contains(e.Location)) {
        MessageBox.Show("Clicked on " + dr["ID"].ToString());
      }
    }
  }
}
于 2012-07-13T15:12:13.407 回答