ラインコントロールにイベントが発生しないことは分かっています。

なので、自作しないといけないのかなと思っていますが、良い方法が見つかりません。クリックイベントが発生するようなラインのユーザーコントロールの作り方を教えていただけませんか?

あるいは、フォームのクリックイベントで、そこがラインコントロール上か否かという判断をさせる方法でもいいです。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

縦線や横線のラインなら簡単ですが、斜めのラインは判定が難しいですね。


最も簡単な手法はラインに特別な色をつけて、フォームクリック時にその色を
取得すればどうでしょうか。
以下のコーディングでラインコントロールをクリックした時に、
その、色をゲットできるので、後はその色番号でクリックされたとみなせばよいでしょう。
色を変えたくないなら、タンジェント等の三角関数がいるような気がします。

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Debug.Print Point(X, Y)
End Sub
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/08/17 23:34

フォーム上のマウスイベントのムーブイベントでマウスカーソル位置を常に取得し、クリックイベントでターゲットのラインとマウスカーソルの位置が一致するかを判断すれば良いのではないでしょうか。



以下サンプル

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
    • good
    • 0

俺なら、ラインコントロールはあきらめて、ラベルコントロールを細くして使います。


ラベルコントロールは、リソースの消費が少ないと聞いた事あるので一番よいかと。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QVB.NETでマウスクリックイベントを発生させたい。

VB.NETでformの外で任意の座標でマウスクリックイベントを発生させたい。
formにはボタンがあり、そのボタンを押すを固定位置(formの外)でマウスの左クリックイベントを発生させたいのですがどのような手段を使えばいいでしょうか。

環境 Windows XP,VB2008 Exoress

Aベストアンサー

こちらの記事がわかりやすくていいんじゃないかなー。
http://blog.livedoor.jp/akf0/archives/51560984.html

Qコントロールが発生させるイベントを回避したい

VB2008です。

状態:
フォーム上にtextbox1、textbox2、button1があり、textbox1からtextbox2もしくはbutton1にフォーカスが移動したとき

1:textbox2への移動->textbox1のlostfocusイベントを通常通り発生させる。

2:button1への移動->textbox1のlostfocusイベントをキャンセルする。(1度たりとも発生させない、もしくは発生してもその処理を1度たりともさせない。)

1は通常の処理なのでなにもしなくていいと思うのですが、2の処理が上手に浮かびません。button1でフラグを立てて、textbox1_lostfocusの処理を抜けるようにしているのですが、必ず1度は処理が実行されます。

どのようにコードを書けばうまくできるでしょうか。もし、これが仕様ということなら、同じような処理をするにはどうすればよいでしょうか。

わかりにくければ補足いたします。よろしくお願いします。

Aベストアンサー

AccessのVBAしか扱ったことのない者ですが(汗)、概念としては共通でいけると思いますので・・・

移動元のFocus喪失系のイベントが終了してからでないと、移動先のFocus取得系のイベントは
発生しないので、移動先でのフラグ処理では間に合わないと推測されます。
従って、移動先によるLostFocusイベントの切り分けは無理だと思いますので、以下はその前提での
対策になります。

1)TextBox1のLostFocusイベントでは、「TextBox1のLostFocusイベントが発生したこと」を記録する
 フラグだけを立てます(変数EveFlag=True)
2)Button1のGotFocusイベントでは、上記フラグを元に戻します(EveFlag=False)
3)TextBox1のLostFocusイベントで行いたかった処理を、イベントとは無関係のPrivate Subとして
 フォーム モジュールに記述します(WhenMoveFromTB1)
4)TextBox1・Button1以外の、Focusを取得できる全コントロールのGotFocusイベントで、上記フラグが
 オンだった場合は、上記Private SubをCallします

・・・以上が概念です。
コードの実例は以下の通り:

Option Explicit
'フォームのモジュールレベルでフラグを宣言
Dim EveFlag As Boolean

Private Sub TextBox1_LostFocus()
  'TextBox1のLostFocusイベントが発生したことをフラグに記録
  EveFlag = True
End Sub

Private Sub WhenMoveFromTB1()
  'フラグの初期化
  EveFlag = False
  'ここ(↓)には、現在、TextBox1のLostFocusイベントに記述している処理を転記
  MsgBox "LostFocusイベントの処理を代行します。"
End Sub

Private Sub TextBox2_GotFocus()
  'TextBox1のLostFocusイベントが必要なTextBox2では、代行するSubをCall
  If EveFlag = True Then Call WhenMoveFromTB1
End Sub

Private Sub Button1_GotFocus()
  'TextBox2のLostFocusイベントが無用のButton1では、フラグの初期化のみを実行
  EveFlag = False
End Sub

Private Sub TextBox3_GotFocus()
  'TextBox1のLostFocusイベントの起動が必要なコントロールがTextBox2以外にも
  'ある場合は、TextBox2と同様に、代行SubをCall
  If EveFlag = True Then Call WhenMoveFromTB1
End Sub


・・・以上です。

AccessのVBAしか扱ったことのない者ですが(汗)、概念としては共通でいけると思いますので・・・

移動元のFocus喪失系のイベントが終了してからでないと、移動先のFocus取得系のイベントは
発生しないので、移動先でのフラグ処理では間に合わないと推測されます。
従って、移動先によるLostFocusイベントの切り分けは無理だと思いますので、以下はその前提での
対策になります。

1)TextBox1のLostFocusイベントでは、「TextBox1のLostFocusイベントが発生したこと」を記録する
 フラグだけを立てます(変...続きを読む

QVB.NETでボタンクリックイベントで次のコントロールへ

VB開発初心者です。
VB.NETでWindowsMobile5.0開発してます。
.NETCONPACTFreameWork2.0です。

TABキーで移動するように
ボタンクリックイベントで次のコントロールへFocusを移動させたいのですがうまく行きません。
下記の記述すればOKだと思いましたが、
Me.SelectNextControl(Me.ActiveControl, True, True, True, True)
ActiveControlを.NETCONPACTFreameWorkがサポートしてませんでした。

ほかに良い方法ありませんでしょうか?
宜しくお願いします。

Aベストアンサー

> ctlPrevはプライベート変数なので
これではダメですね
『プライベート変数』という表現もおかしいと思います
本来は『ローカル(局所)変数』とすべきでしょう

『フォームクラスのスコープを持つ変数』としてctlPrevを宣言しましょう
PublicでもPrivateでもProtectedでも構いません

QVB.NETでボタンクリックイベントの後に来るPage_Loadのようなイベントはありますか?

タイトルのとおりなのですが、
VB.NETでボタンクリックイベントの後に来るPage_Loadのようなイベントはありますか?
教えてくださいーー

Aベストアンサー

お世話になります。

ボタンを押そうが何をしようが、
PostBack するたびに、Page_Load は走りますよ。
そこで判断をしたいのであれば、
Page.Load イベント内で以下の様に記述してやれば
よいかもしれません。

If IsPostBack Then
  ' 初めてページを読み込んだ時処理
Else
  ' そうでない時処理
  If Not Request("ボタンの name") Is Nothing Then
    ' ボタン押下により発生した PostBack
  End If
End If

参考URL:http://msdn2.microsoft.com/ja-JP/library/system.web.ui.page.ispostback.aspx

QDataGridViewでセルクリックイベントを発生させるには

DataGridViewでセルクリックイベントを発生させるには、
デザイナからではCellClickイベントハンドラとなりますが、
プログラムコード上から発生させるにはどのようにすればよろしいでしょうか?

CurrentCellでアクティブセルを変更した時に、そこのセルをクリックさせるイベントが欲しいのですが・・

宜しくお願い致します。

Aベストアンサー

CellClickイベントハンドラの内容を別のメソッドとして作り、アクティブセルを変更した際にそのメソッドを呼び出す方法ではダメなのでしょうか?
どうしてもCellClickイベントを発生させて処理をしたいのでしょうか?


このカテゴリの人気Q&Aランキング

おすすめ情報