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

コンテナのイベントを処理し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 に答える
1

いいえ。 で物をレンダリングするとき、描画Graphicsされたオブジェクトにイベントをバインドすることはできません。

2 つの解決策があります。フォーム上でのマウス クリック (MouseClickイベント ) をキャッチし、マウスがレンダリングされた文字列上にあるかどうかを判断する ( を使用してレンダリング領域を取得するMeasureString) ことができます。しかし、これは不必要に難しく複雑です。

代わりに、フォーム上でコントロールを動的に生成することをお勧めしました。Buttonまたは、フォーム上のテキストだけのスタイルが好きな場合は、またはを生成しLabel、EventHandler をそれらのMouseClickイベントにバインドできます。

于 2012-07-13T14:24:57.723 に答える