座標の指定について

解決


アラタ  2010-02-03 19:17:20  No: 143184  IP: [192.*.*.*]

[VISTA VB.NET 2005]
btn1をドラッグ中にbtn2の領域内に入ると反応する。
といった記述をしたいのですが、MouseEnter,MouseLeaveだと、マウスが直接btn2に触れないといけないので、今回の記述では使えませんでした。
そこで座標で指定をしようと思って、
'btn2のロケーションを0,0、サイズを10,10として

If X >= 0 And X <= 10 And Y >= 0 And Y <= 10  Then
      btn2.FlatStyle = FlatStyle.Popup
    Else
      btn2.FlatStyle = FlatStyle.Standard
    End If

と書いたのですが、実際のButtonの数は10〜X個あるので、配列を作ってなんらかのLoopを使いたいのですが、座標をずらしながら配列に命令を与える記述がよくわかりません。
なにか案はありませんでしょうか?

編集    削除
花ちゃん  2010-02-03 20:39:14  No: 143185  IP: [192.*.*.*]

MouseHover イベントではだめなのですか?

編集    削除
JING  2010-02-03 20:52:20  No: 143186  IP: [192.*.*.*]

返信ありがとうございます。
MouseHoverも同じように、マウスでbtn2に直に触れていないと反応しないので、ドラッグ中(マウスとbtn2の間にbtn1がある)だと使えませんでした。

ちなみにコントロールのドラッグは以下のようにしています。

Private Drag As Boolean
Private mousePoint As Point

Private Sub btn1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btn1.MouseDown
        sender.BringToFront()

        If e.Button = MouseButtons.Left Then
            Drag = True
            mousePoint = New Point(e.X, e.Y)
        End If
End Sub

Private Sub btn1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btn1.MouseMove

        If Drag = True Then

        Dim DestX As Integer = sender.Location.X + e.X - mousePoint.X
        Dim DestY As Integer = sender.Location.Y + e.Y - mousePoint.Y

        sender.Location = New Point(DestX, DestY)

        End If
End sub

編集    削除
 2010-02-03 22:31:00  No: 143187  IP: [192.*.*.*]

DrugOverやDrugLeaveイベントは使えますか?

編集    削除
 2010-02-03 22:34:26  No: 143188  IP: [192.*.*.*]

失礼。DragOverやDragLeaveイベントの間違いでした。
(Drugだなんて、変なクスリみたい...)

編集    削除
アラタ  2010-02-03 23:07:53  No: 143189  IP: [192.*.*.*]

DragDropもMouseイベントと同じでした↓
(ボタンじゃなくてラベルとピクチャーボックスになってますが)

Private mousePoint As Point
    Dim dragBox As Rectangle = Rectangle.Empty
    Dim Xsave As Integer, Ysave As Integer

    Private Sub form1_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragOver
        If e.AllowedEffect = DragDropEffects.Move Then
            e.Effect = DragDropEffects.Move
        End If
    End Sub

    Private Sub form1_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
        If e.Data.GetDataPresent(GetType(PictureBox)) And (e.Effect = DragDropEffects.Move) Then
            Dim pict As PictureBox = e.Data.GetData(GetType(PictureBox))
            Dim pos As Point = New Point(e.X, e.Y)
            pos = Me.PointToClient(pos)
            'pos = pos - New Point(pict.Width \ 2, pict.Height \ 2)
            pos = New Point(pos.X - Xsave, pos.Y - Ysave)
            pict.Location = pos
            
        End If
    End Sub

    Private Sub pic1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pic1.MouseDown
        Dim sz As Size = SystemInformation.DragSize
        dragBox = New Rectangle(e.X - sz.Width / 2, e.Y - sz.Height / 2, sz.Width, sz.Height)
        Xsave = e.X : Ysave = e.Y

        If e.Button = MouseButtons.Left Then
            mousePoint = New Point(e.X, e.Y)
        End If

    End Sub

    Private Sub pic1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pic1.MouseMove

        If e.Button = Windows.Forms.MouseButtons.Left Then
            sender.Location = Point.op_Subtraction(Me.PointToClient(Cursor.Position), mousePoint)
            If Not dragBox.Contains(e.X, e.Y) Then
                Dim DropResult As DragDropEffects = pic1.DoDragDrop(pic1, DragDropEffects.Move)
                dragBox = Rectangle.Empty
            End If
        End If
    End Sub

    Private Sub pic1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pic1.MouseUp
        dragBox = Rectangle.Empty
        mousePoint = Point.Empty
    End Sub

    Private Sub lbl1_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lbl1.DragEnter
        sender.BackColor = Color.Red
    End Sub

    Private Sub lbl1_DragLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbl1.DragLeave
        sender.BackColor = Color.White
    End Sub

    Private Sub lbl1_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lbl1.DragOver
        If e.AllowedEffect = DragDropEffects.Move Then
            e.Effect = DragDropEffects.Move
        End If
    End Sub

    Private Sub pic1_GiveFeedback(ByVal sender As System.Object, ByVal e As System.Windows.Forms.GiveFeedbackEventArgs) Handles pic1.GiveFeedback
        If e.Effect = DragDropEffects.Move Then
            sender.Location = Point.op_Subtraction(Me.PointToClient(Cursor.Position), mousePoint)
        End If
    End Sub

編集    削除
 2010-02-03 23:40:48  No: 143190  IP: [192.*.*.*]

ええっと、最初の話からだいぶ変わっているようなんだけど。。。
結局何をしたいの?
やみくもにソースを貼り付けられてもなぁ。。。

編集    削除
アラタ  2010-02-04 00:11:40  No: 143191  IP: [192.*.*.*]

挙げられたイベントで書いてもだめっだったって例のソース貼っただけで、
質問自体は最初に書いたまんまですが・・・。

編集    削除
ぴよ  2010-02-04 05:31:04  No: 143192  IP: [192.*.*.*]

これらのソースを全部はる必要ってあるの?
これらのソースを全部解読しろと?
それにbtnはどこに行った?何でボタンじゃなくってラベルとピクチャーボックス?

編集    削除
魔界の仮面弁士  2010-02-04 08:28:00  No: 143193  IP: [192.*.*.*]

質問の意図を理解し切れているか分かりませんが、これでどうでしょう。

http://www.vb-user.net/junk/replySamples/2010.02.03.23.23/DragItem.txt

編集    削除
アラタ  2010-02-04 20:32:24  No: 143194  IP: [192.*.*.*]

皆さん返信ありがとうございます。
ぴよ様。
ソースを貼ったのは、初心者という肩書きで質問をしておきながら、
せっかくの提案を無碍に却下するのもどうかと思ったので、
試してみたけれどだめだったという意味で記述してみました。
不快に思ったのでしたら申し訳ありません。
魔界の仮面弁士様。
ソースありがとうございます。各種掲示板でいつも勉強させてもらっています。
透明率が1以下だと反応するのですね、完璧に盲点でした・・・。
おかげさまで、なんとかなりそうです。

編集    削除
アラタ  2010-02-04 21:08:39  No: 143195  IP: [192.*.*.*]

すいません、解決チェック忘れてました。

編集    削除
魔界の仮面弁士  2010-02-04 21:53:45  No: 143196  IP: [192.*.*.*]

> せっかくの提案を無碍に却下するのもどうかと思ったので、
却下も何も、私のコードもその Drag&Drop によるものですよ。

> 試してみたけれどだめだったという意味で記述してみました。
えさんやぴよさんが書かれたのは、その「試す」際に、わざわざ
>> (ボタンじゃなくてラベルとピクチャーボックスになってますが)
に仕様変更された点が意図不明だった、という事ではないかと。


で、今回の件は、
>> マウスが直接btn2に触れないといけないので
ということが分かっていて、それでも btn1 を動かし続けようとした事で
泥沼にはまってしまったのだと思います。
(私のコードでは、btn1 そのものの座標は動かしていません)

btn1 を追従させて動かすということで、私は当初、
    Region を設定してボタンをつかんだ箇所を「くりぬいて」おき、
    下のコントロールにマウス操作が通知されるようにする
といった方法を考えたのですが、これも良策では無いと思ったので、
標準的なドラッグ&ドロップの手法のみで実装しています。


> 透明率が1以下だと反応するのですね、完璧に盲点でした・・・。
ちょっと違います。
マウス操作を透過させているのは、WS_EX_TRANSPARENT の指定です。

ただしこれは、Layerd Window に対する指定であるがため、
透過率の設定が必要という点はその通りです。少し難しい話になりますが、
この点の仕様は、下記の[ヒットテスト]の項にて解説されています。
http://msdn.microsoft.com/ja-jp/library/ms997507.aspx#layerwin_topic2b

編集    削除
アラタ  2010-02-04 22:07:19  No: 143197  IP: [192.*.*.*]

考えがおよびもしないソースがいくつもあり、自分にはまだ早い段階だったと痛感しました。
身の丈にあった妥協点を設けずに開発しようとしたことを反省します。
お手数をおかけしました。

編集    削除
マリネ  2010-02-04 22:25:41  No: 143198  IP: [192.*.*.*]

ボタンを配列にして、必要に応じてその各ボタンを選んで命令を与えたいなら、コーディングでボタンコントロール配列を作ったらいけますけど??
わかりますか?
ヒントでわからなかったらサンプル書きましょうか?座標も自由に出来ますけど。

編集    削除
アラタ  2010-02-05 23:22:44  No: 143199  IP: [192.*.*.*]

マリネ様。
返信ありがとうございます。
「座標の指定について」なんてタイトルをしておりますが、
魔界の仮面弁士様のDragDropが理想の形だったので、そちらで開発しようと思います。

編集    削除