• ベストアンサー

ラインコントロールにクリックイベント

ラインコントロールにイベントが発生しないことは分かっています。 なので、自作しないといけないのかなと思っていますが、良い方法が見つかりません。クリックイベントが発生するようなラインのユーザーコントロールの作り方を教えていただけませんか? あるいは、フォームのクリックイベントで、そこがラインコントロール上か否かという判断をさせる方法でもいいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • VT250F
  • ベストアンサー率30% (26/84)
回答No.3

縦線や横線のラインなら簡単ですが、斜めのラインは判定が難しいですね。 最も簡単な手法はラインに特別な色をつけて、フォームクリック時にその色を 取得すればどうでしょうか。 以下のコーディングでラインコントロールをクリックした時に、 その、色をゲットできるので、後はその色番号でクリックされたとみなせばよいでしょう。 色を変えたくないなら、タンジェント等の三角関数がいるような気がします。 Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Debug.Print Point(X, Y) End Sub

g_express999
質問者

お礼

この場を借りて、皆さんにお礼を申し上げたいと思います。 いろいろな方法があるものですね。 質問してみてよかったです。

その他の回答 (2)

  • don_cha
  • ベストアンサー率34% (139/407)
回答No.2

フォーム上のマウスイベントのムーブイベントでマウスカーソル位置を常に取得し、クリックイベントでターゲットのラインとマウスカーソルの位置が一致するかを判断すれば良いのではないでしょうか。 以下サンプル Dim Mx As Single Dim My As Single Private Sub Form_Click()   If (Line1.X1 <= Mx And Line1.X2 >= Mx And Line1.Y1 <= My And Line1.Y2 >= My) Then     MsgBox "クリックされた位置がライン上です"   End If End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)   Mx = X   My = Y End Sub

  • Masato_a
  • ベストアンサー率21% (13/60)
回答No.1

俺なら、ラインコントロールはあきらめて、ラベルコントロールを細くして使います。 ラベルコントロールは、リソースの消費が少ないと聞いた事あるので一番よいかと。

関連するQ&A

  • VB6 ユーザコントロールでクリックイベント

    コンボボックスにclickイベントを書いたのち(この段階ではprivate) このコントロールをユーザコントロールにしました。 フォーム上に上記のユーザコントロールを配置したところ クリックイベントが発生しません クリックイベントを発生させるには 何か特殊な記述が必要ですか?(例えばオーバライドとか) どうすればクリックイベントを発生させられますか

  • ユーザコントロールのイベント取得について(C#)

    環境:Visual Studio 2005 C# Windows Application フォームに自作のユーザコントロールを貼り付けてそのイベントを取得する勉強をしているものです。 フォームでのユーザコントロールイベントを取得して処理をする方法が分かりません。 状況 ユーザコントロールにはテキストボックスを追加しています。 また、フォームにそのユーザコントロールを追加しています。 確認したいことは、ユーザコントロールのテキストボックスになにか値を入力したタイミングでチェンジイベントをフォーム側で察知し、処理をするというものです。 どなたか、要点だけでもいいので教えていただけないでしょうか? 宜しくお願いいたします。

  • .Net ユーザーコントロールのイベント

    質問させていただきます。 環境はVB.NET2003 WindowsXPです。 あるユーザーコントロール(Form)にボタンが用意されており、そのユーザーコントロールを別のフォームAに貼り付けたとします。 この時、Aのコード内でユーザーコントロール上のボタンのClickイベントを取得する方法がございましたら、回答をよろしくお願いします。

  • VB2008でユーザーコントロールのイベントについて

    VB2008でユーザーコントロールのイベントについて 作成したユーザーコントロールを(1)フォームに配置した時のみ実行される (2)フォームを実行した時のみ実行される それぞれ処理を分けたいのですが、適切なイベントが見つかりません。 何か区分けのできる方法はあるのでしょうか? 何方か教えていただけませんか

  • サブフォームでのダブルクリックイベント

    Access2003です。 フォームにサブフォームを設置し、直接テーブルを表示させています。 このサブフォームのテーブルのある行をダブルクリックしたら その行のデータを他のフォームのオブジェクトにセットしたいのですが 行や行のデータ全てを取得は出来るのですが、サブフォームのイベントがEnterとExitしかなくて、イベント発生が出来ません。 フォームのダブルクリックでXとYを見て…と思ったのですがサブフォーム上ではフォームのダブルクリックイベントが発生せず。 サブフォームのテーブルはユーザーがソートする事もあるのでベタに上にテキストボックス等を置く事は出来ません。 どうにかダブルクリックで動作させる方法はありませんでしょうか?

  • フォーム上の任意のコントロール上でのイベントをまとめてハンドリングする方法

    .NETにおいて、フォーム上に配置されたコントロールで発生したイベントを、各コントロールごとではなくて、まとめてハンドルする方法はないでしょうか。 例えば次のようなフォームがあります。 (Button1, Button2, Button3は、フォームに配置されたボタンとします) Public Class MyForm   Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click   End Sub End Class ボタンが3つ程度の場合はこれで良いと思うのですが、例えば(極端に言えば)ボタンが100個ある場合、 Handles Button1.Click, Button2.Click, (途中省略.....) Button100.Click と書くしかないのでしょうか。 後で対象コントロールが増えたり減ったりした場合に間違いが起こりそうなので、このような書き方は避けたいです。 フォーム上のどのコントロールでも構わないからとにかくクリックイベントが発生したことを知るための方法はないでしょうか。 例えば次のようなかんじでハンドリングできないでしょうか。 Private Sub All_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles フォーム上の任意のコントロールでのClickイベント End Sub (環境はVB.NET2005です)

  • C# 子のコントロールからイベントを送る方法?

    毎度お世話になっております。 何の手も加えていないフォームに自分で作った ユーザコントロールを張り付け、そのコントロールからイベントが 発生したら、親フォームを閉じるようにしたいと思っています。 下記にサンプルを記述します。 フォーム側(using文、Designer文は省略) namespace WindowsFormsApplication1 { public partial class Form1 : Form { private string[] stLines = { "こんにちは。", "こんばんは。", "おはよう。", "さようなら。", "おやすみなさい。", }; public Form1() { InitializeComponent();  // 省略 JLabel j = new JLabel(stLines); j.Dock = DockStyle.Fill; this.Controls.Add(j); } } } ユーザコントロール側(Labelを継承) namespace WindowsFormsApplication1 { public class JLabel : Label { private string[] stLines = null; private int lineNo = 0; public JLabel(string[] Lines) { this.Click += new System.EventHandler(this.Jlabel_Click); this.stLines = Lines; this.lineNo = 0; } private void Jlabel_Click(object sender, EventArgs e) { this.lineNo++; if (this.stLines.Length > this.lineNo) { this.Text = this.stLines[this.lineNo]; } else { //ここでイベントを発生させたい //this.lineNo = 0; } } } } 上記のように、渡された文字列をもとに、クリックするごとに次の行を 表示するプログラムですが、行番号が行数を超えた場合にイベントを 発生させて、それを親のフォームが監視し、受け取った際にフォームを 閉じるといった処理をさせたいのです。 親のフォームにクリックイベントを仕掛ければ楽ではありますが、 子供のコントロールからの信号を、親が受け取る…といった流れにしたいのです。 以上、よろしくお願いいたします。

  • comboboxのクリックイベントについて

    VB6です comboboxを設置してクリックイベントに処理を書いたら、フォームロード時に必ず1回クリックイベントが発生します。 当初はフラグを立ててこの現象を回避していたのですが、コードを書くうちに、この最初のクリックイベントが面倒で仕方ありません。 comboboxを設置するとフォームロード時に必ずクリックイベントが発生するのはVB6の仕様なのでしょうか。 それともほかに回避の仕方があるのでしょうか。

  • マウスをクリックしたときのイベント

    VisualC++2010のButton Controlのイベントについて 「BN_CLICKED」イベントはマウスをクリックして、放した時に発生します。 クリックしたときのイベントは取れないのでしょうか? *設定時間、押しっぱなしで、次の処理に移るというプログラムを書きたいため  悩んでいます。

  • シートのクリックイベントは拾えないのか?

    ExcelのVBAに関する質問です。 さきほど「セルをクリック、またはダブルクリックしたときに○○したい」という質問に回答したのですが、「セルをクリックした」というイベントを拾う方法がわからず、ダブルクリックのパターンで回答しました。 Worksheetのイベントには BeforeDobuleClick や BeforeRightClick はあるのに Click や onClick というイベントがありません。オートシェイプなどのオブジェクトやフォーム上のオブジェクトには Click イベントがあるのですが、Worksheet になぜかありません。 これまでも同様のケースがあり、ネットで検索したりしたのですが、どれも SelectionChange で代用するものでした。それだと確かにマウスで別セルを選択したときにイベントが発生しますが、 ・キーボード操作でセルを移動してもイベントが発生する ・現在選択しているセルをクリックしてもイベントが発生しない と、厳密はマウスでクリックしたときと同じ動作になりません。 確か以前の質問で「あるセルをクリックするたびに、他のセルの値をカウントアップしたい」というようなものもありました。このような場合には、やはり Click に相当するようなイベントで処理したいです。 どうにかしてWorksheetでクリックイベントを拾うことはできないのでしょうか?