[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を使いたいのですが、座標をずらしながら配列に命令を与える記述がよくわかりません。
なにか案はありませんでしょうか?
MouseHover イベントではだめなのですか?
返信ありがとうございます。
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
DrugOverやDrugLeaveイベントは使えますか?
失礼。DragOverやDragLeaveイベントの間違いでした。
(Drugだなんて、変なクスリみたい...)
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
ええっと、最初の話からだいぶ変わっているようなんだけど。。。
結局何をしたいの?
やみくもにソースを貼り付けられてもなぁ。。。
挙げられたイベントで書いてもだめっだったって例のソース貼っただけで、
質問自体は最初に書いたまんまですが・・・。
これらのソースを全部はる必要ってあるの?
これらのソースを全部解読しろと?
それにbtnはどこに行った?何でボタンじゃなくってラベルとピクチャーボックス?
質問の意図を理解し切れているか分かりませんが、これでどうでしょう。
http://www.vb-user.net/junk/replySamples/2010.02.03.23.23/DragItem.txt
皆さん返信ありがとうございます。
ぴよ様。
ソースを貼ったのは、初心者という肩書きで質問をしておきながら、
せっかくの提案を無碍に却下するのもどうかと思ったので、
試してみたけれどだめだったという意味で記述してみました。
不快に思ったのでしたら申し訳ありません。
魔界の仮面弁士様。
ソースありがとうございます。各種掲示板でいつも勉強させてもらっています。
透明率が1以下だと反応するのですね、完璧に盲点でした・・・。
おかげさまで、なんとかなりそうです。
すいません、解決チェック忘れてました。
> せっかくの提案を無碍に却下するのもどうかと思ったので、
却下も何も、私のコードもその Drag&Drop によるものですよ。
> 試してみたけれどだめだったという意味で記述してみました。
えさんやぴよさんが書かれたのは、その「試す」際に、わざわざ
>> (ボタンじゃなくてラベルとピクチャーボックスになってますが)
に仕様変更された点が意図不明だった、という事ではないかと。
で、今回の件は、
>> マウスが直接btn2に触れないといけないので
ということが分かっていて、それでも btn1 を動かし続けようとした事で
泥沼にはまってしまったのだと思います。
(私のコードでは、btn1 そのものの座標は動かしていません)
btn1 を追従させて動かすということで、私は当初、
Region を設定してボタンをつかんだ箇所を「くりぬいて」おき、
下のコントロールにマウス操作が通知されるようにする
といった方法を考えたのですが、これも良策では無いと思ったので、
標準的なドラッグ&ドロップの手法のみで実装しています。
> 透明率が1以下だと反応するのですね、完璧に盲点でした・・・。
ちょっと違います。
マウス操作を透過させているのは、WS_EX_TRANSPARENT の指定です。
ただしこれは、Layerd Window に対する指定であるがため、
透過率の設定が必要という点はその通りです。少し難しい話になりますが、
この点の仕様は、下記の[ヒットテスト]の項にて解説されています。
http://msdn.microsoft.com/ja-jp/library/ms997507.aspx#layerwin_topic2b
考えがおよびもしないソースがいくつもあり、自分にはまだ早い段階だったと痛感しました。
身の丈にあった妥協点を設けずに開発しようとしたことを反省します。
お手数をおかけしました。
ボタンを配列にして、必要に応じてその各ボタンを選んで命令を与えたいなら、コーディングでボタンコントロール配列を作ったらいけますけど??
わかりますか?
ヒントでわからなかったらサンプル書きましょうか?座標も自由に出来ますけど。
マリネ様。
返信ありがとうございます。
「座標の指定について」なんてタイトルをしておりますが、
魔界の仮面弁士様のDragDropが理想の形だったので、そちらで開発しようと思います。
ツイート | ![]() |