C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ドラッグ&ドロップと移動を同時にやる方法


(過去ログ 102 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■60800 / inTopicNo.1)  ドラッグ&ドロップと移動を同時にやる方法
  
□投稿者/ やんまー (64回)-(2011/07/19(Tue) 15:50:11)

分類:[VB.NET/VB2005 以降] 

2011/07/19(Tue) 15:50:29 編集(投稿者)

お陰さまで
Picturebox→リストボックス
のドラッグアンドドロップをすることができました!

そこで、さらに、ドラッグ時に画像がマウスについてくるようにしたいと思ったのですが、
上手くいかず困っています。
(ソリティアの用な感じです。)


↓こちらを参考にしまして

 コントロールをマウスで移動
 http://www.cocoaliz.com/vb.net/index/48/
 


Sub PictureBox2MouseMove を以下のように書き換えてみたのですが、
上手く動きませんでした。正確にはちょっと動くのですが、、、

If mouseDownPoint 〜
を削除するとちゃんと移動できるので、無理ということなのだと思うのですが・・・

べつにこの方法でなくても、
ドラッグ中にポインタのところに画像が表示されるだけでいいのですが、何かいい方法はないでしょうか。

※ もう一案として、pictureboxを重ねて配置して、一つをドラッグ用、ひとつは移動用にすれば、、
  と思ったのですが、コントロールを重ねてしまうと、下側のコントロールにはイベントが発生しないのですね。。。


---------
Sub PictureBox2MouseMove(sender As Object, e As MouseEventArgs)
'左クリックの場合
If e.Button = MouseButtons.Left Then

'コントロール取得
Dim control As Control = CType(sender, Control)

'コントロールの位置を設定
control.Left = control.Left + e.X - startX
control.Top = control.Top + e.Y - startY

'リフレッシュ
Me.Refresh()

End If

If mouseDownPoint <> Point.Empty Then
'ドラッグとしないマウスの移動範囲を取得する
Dim moveRect As New Rectangle(mouseDownPoint.X - SystemInformation.DragSize.Width / 2, mouseDownPoint.Y - SystemInformation.DragSize.Height / 2, SystemInformation.DragSize.Width, SystemInformation.DragSize.Height)
'ドラッグとする移動範囲を超えたか調べる
If Not moveRect.Contains(e.X, e.Y) Then
'ドラッグの準備
Dim pic As PictureBox = DirectCast(sender, PictureBox)
'ドラッグ&ドロップ処理を開始する
Dim dde As DragDropEffects = pic.DoDragDrop(Me.pictureBox2, DragDropEffects.Copy)
mouseDownPoint = Point.Empty
End If
End If
End Sub

---------


引用返信 編集キー/
■60801 / inTopicNo.2)  Re[1]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ shu (865回)-(2011/07/19(Tue) 16:37:50)
No60800 (やんまー さん) に返信

コントロールの移動が実装出来るなら、通常のドラッグアンドドロップはいらないと思う。
移動後どこでマウスアップされたかを調べそこのコントロールへドロップと同じ処理をすると
よいかと思います。
引用返信 編集キー/
■60802 / inTopicNo.3)  Re[1]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ 風太郎 (32回)-(2011/07/19(Tue) 17:28:41)
No60800 (やんまー さん) に返信
> 2011/07/19(Tue) 15:50:29 編集(投稿者)
>
> お陰さまで
> Picturebox→リストボックス
> のドラッグアンドドロップをすることができました!
>
> そこで、さらに、ドラッグ時に画像がマウスについてくるようにしたいと思ったのですが、
> 上手くいかず困っています。
> (ソリティアの用な感じです。)
>
>
> ↓こちらを参考にしまして
>
>  コントロールをマウスで移動
>  http://www.cocoaliz.com/vb.net/index/48/
>  
>
>
> Sub PictureBox2MouseMove を以下のように書き換えてみたのですが、
> 上手く動きませんでした。正確にはちょっと動くのですが、、、
>
> If mouseDownPoint 〜
> を削除するとちゃんと移動できるので、無理ということなのだと思うのですが・・・
>
> べつにこの方法でなくても、
> ドラッグ中にポインタのところに画像が表示されるだけでいいのですが、何かいい方法はないでしょうか。
>
> ※ もう一案として、pictureboxを重ねて配置して、一つをドラッグ用、ひとつは移動用にすれば、、
>   と思ったのですが、コントロールを重ねてしまうと、下側のコントロールにはイベントが発生しないのですね。。。
>
>
> ---------
> Sub PictureBox2MouseMove(sender As Object, e As MouseEventArgs)
> '左クリックの場合
> If e.Button = MouseButtons.Left Then
>
> 'コントロール取得
> Dim control As Control = CType(sender, Control)
>
> 'コントロールの位置を設定
> control.Left = control.Left + e.X - startX
> control.Top = control.Top + e.Y - startY
>
> 'リフレッシュ
> Me.Refresh()
>
> End If
>
> If mouseDownPoint <> Point.Empty Then
> 'ドラッグとしないマウスの移動範囲を取得する
> Dim moveRect As New Rectangle(mouseDownPoint.X - SystemInformation.DragSize.Width / 2, mouseDownPoint.Y - SystemInformation.DragSize.Height / 2, SystemInformation.DragSize.Width, SystemInformation.DragSize.Height)
> 'ドラッグとする移動範囲を超えたか調べる
> If Not moveRect.Contains(e.X, e.Y) Then
> 'ドラッグの準備
> Dim pic As PictureBox = DirectCast(sender, PictureBox)
> 'ドラッグ&ドロップ処理を開始する
> Dim dde As DragDropEffects = pic.DoDragDrop(Me.pictureBox2, DragDropEffects.Copy)
> mouseDownPoint = Point.Empty
> End If
> End If
> End Sub
>
> ---------
>
>

なんとなく、こういう事なのかな?と思って適当に作ってみました。

http://www1.axfc.net/uploader/Sc/so/256618

*ダウンロードキーは、私の名前です。
引用返信 編集キー/
■60806 / inTopicNo.4)  Re[2]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ やんまー (65回)-(2011/07/19(Tue) 21:43:59)
風太郎 さん

ありがとうございます。

移動できることを確認いたしました。
これに追加で、リストボックスへのドラッグアンドドロップをしたいということです。

よろしくお願いします!

引用返信 編集キー/
■60809 / inTopicNo.5)  Re[2]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ やんまー (66回)-(2011/07/19(Tue) 22:08:42)
2011/07/19(Tue) 22:09:30 編集(投稿者)
shu さん

> コントロールの移動が実装出来るなら、通常のドラッグアンドドロップはいらないと思う。
> 移動後どこでマウスアップされたかを調べそこのコントロールへドロップと同じ処理をすると
> よいかと思います。


何時もありがとうございます。早速やってみました。

上手くできたかと思ったのですが、上手く追加できたり、できなかったりします。。。


↓このようにしていたのを

--------------------------
	Sub PictureBox1MouseMove(sender As Object, e As MouseEventArgs)
		If mouseDownPoint <> Point.Empty Then
			'ドラッグとしないマウスの移動範囲を取得する
			Dim moveRect As New Rectangle(mouseDownPoint.X - SystemInformation.DragSize.Width / 2, _
			                              mouseDownPoint.Y - SystemInformation.DragSize.Height / 2, _
			                              SystemInformation.DragSize.Width, _
			                              SystemInformation.DragSize.Height)
			'ドラッグとする移動範囲を超えたか調べる
			If Not moveRect.Contains(e.X, e.Y) Then
				'ドラッグの準備
				Dim pic As PictureBox = DirectCast(sender, PictureBox)
				'ドラッグ&ドロップ処理を開始する
				Dim dde As DragDropEffects = pic.DoDragDrop(Me.pictureBox1, DragDropEffects.Copy)
				mouseDownPoint = Point.Empty
			End If
		End If
	End Sub

--------------------------



↓このようにしたのですが、



---------------------------
    Dim startX As Integer
    Dim startY As Integer
    
	Sub PictureBox1MouseMove(sender As Object, e As MouseEventArgs)
		'左クリックの場合
		If e.Button = MouseButtons.Left Then
			'コントロール取得
			Dim control As Control = CType(sender, Control)
			'コントロールの位置を設定
			control.Left = control.Left + e.X - startX
			control.Top = control.Top + e.Y - startY
			'リフレッシュ
		End If
	End Sub

	Sub PictureBox1MouseUp(sender As Object, e As MouseEventArgs)
			Dim pic As PictureBox = DirectCast(sender, PictureBox)
			'ドラッグ&ドロップ処理を開始する
			Dim dde As DragDropEffects = pic.DoDragDrop(Me.pictureBox1, _
														DragDropEffects.Copy)
			'左クリックの場合
			If e.Button = MouseButtons.Left Then				
				'コントロール取得
				Dim control As Control = CType(sender, Control)				
				'コントロールの位置を設定
				control.Left = 155
				control.Top =   35
				'リフレッシュ
				Me.Refresh()
			End If
	End Sub
---------------------------





おそらく、リストボックス内に入ったときに画像が変化するような効果がないために追加しにくいのでは?と思います・・・

また、コントロールそのものを移動しているために、
Listboxでドロップしたときに、ピクチャーボックスとリストボックスが重なっている状態のため上手くイベントが発生しない
ことがあるのではないかと、感じました。

(コントロールを重ねて、マウスUPやマウスDOWNのイベントを調べてみると、下側にあるコントロールは反応しないですよね?)

とすると、またさらに違う方法で、表現はできないのか、と思っています。

例えば、ドラッグしたときには、マウスポインタのところに画像を表示する、、とか。。。


何かいい手はないでしょうか・・・

引用返信 編集キー/
■60812 / inTopicNo.6)  Re[3]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ shu (866回)-(2011/07/19(Tue) 22:50:11)
No60809 (やんまー さん) に返信

picCopyは通常非表示になっており、picMain(ドラッグ対象)でMouseDownされたときにpicMainの後ろに表示されます。
MouseMove中、picMainを動かし、MouseUpでGetChildAtPointにてMousePositionの場所のコントロールを調べます。
Panel等の中にあるコントロールであることを考慮しControls>0ならその中に対し繰り返し探します。GetChildAtPointでは
見つけられない状態であるなら全コントロール中マウスポジションを含む範囲をもつコントロールを取得する必要があります。
picMainがPanelなどの中にある場合、そのPanel外へコントロールを移動することが出来ない為工夫が必要です。


    Private m_ptMove As Point

    Private Sub picMain_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picMain.MouseDown
        picCopy.Location = picMain.Location
        picCopy.Size = picMain.Size
        picMain.BringToFront()
        picCopy.Image = picMain.Image.Clone
        picCopy.SizeMode = picMain.SizeMode
        picCopy.Visible = True
        m_ptMove = e.Location
    End Sub

    Private Sub picMain_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picMain.MouseMove
        If Not picCopy.Visible Then Exit Sub
        Dim diffx = e.X - m_ptMove.X
        Dim diffy = e.Y - m_ptMove.Y

        picMain.Location = New Point(picMain.Left + diffx, picMain.Top + diffy)
    End Sub

    Private Sub picMain_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picMain.MouseUp
        Dim pt = picMain.PointToScreen(e.Location)
        picMain.Location = picCopy.Location
        picCopy.Visible = False
        Dim cl = Me.GetChildAtPoint(Me.PointToClient(pt))

        Do
            If cl Is ListBox1 Then
                ListBox1.Items.Add(picMain.ImageLocation)
                Exit Do
            ElseIf cl.Controls.Count > 0 Then
                cl = cl.GetChildAtPoint(cl.PointToClient(pt))
            Else
                Exit Do
            End If
        Loop
    End Sub

引用返信 編集キー/
■60815 / inTopicNo.7)  Re[4]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ やんまー (67回)-(2011/07/20(Wed) 01:45:08)
2011/07/20(Wed) 01:46:28 編集(投稿者)
shu さん


ありがとうございます!

これはよさそうですね!!、、、と思ったのですが、やはり上手く動かなくて困りました・・・


Moveを以下のようにしているのですが、DragDropEffects の行を実行すると挙動が変になります。

変になるというのは、動きがぎこちなくなったり、そもそも表示しなかったり、します。

# picturebox1 が上面でpicturebox_1が下側です。


---

	Sub PictureBox1MouseMove(sender As Object, e As MouseEventArgs)
		
		If Not pictureBox_1.Visible Then Exit Sub
		Debug.Print("MOVE!")
		Dim diffx = e.X - m_ptMove.X
		Dim diffy = e.Y - m_ptMove.Y
		
		pictureBox_1.Location = New Point(pictureBox1.Left + diffx, _
									pictureBox1.Top + diffy)
		
		
		If mouseDownPoint <> Point.Empty Then
			'ドラッグとしないマウスの移動範囲を取得する
			Dim moveRect As New Rectangle(mouseDownPoint.X - SystemInformation.DragSize.Width / 2, mouseDownPoint.Y - SystemInformation.DragSize.Height / 2, SystemInformation.DragSize.Width, SystemInformation.DragSize.Height)
			'ドラッグとする移動範囲を超えたか調べる
			If Not moveRect.Contains(e.X, e.Y) Then
				'ドラッグの準備
				Dim pic As PictureBox = DirectCast(sender, PictureBox)
				'ドラッグ&ドロップ処理を開始する
				Dim dde As DragDropEffects = pic.DoDragDrop(Me.pictureBox1, DragDropEffects.Copy) '★ここです★
				mouseDownPoint = Point.Empty
			End If
		End If
		

	End Sub

引用返信 編集キー/
■60816 / inTopicNo.8)  Re[5]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ shu (867回)-(2011/07/20(Wed) 07:37:22)
No60815 (やんまー さん) に返信


> これはよさそうですね!!、、、と思ったのですが、やはり上手く動かなくて困りました・・・
>
>
> Moveを以下のようにしているのですが、DragDropEffects の行を実行すると挙動が変になります。

DoDragDrop〜によるドラッグアンドドロップ操作は不要です。
引用返信 編集キー/
■60818 / inTopicNo.9)  Re[6]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ やんまー (68回)-(2011/07/20(Wed) 08:25:55)
shu さん


>>Moveを以下のようにしているのですが、DragDropEffects の行を実行すると挙動が変になります。
>
> DoDragDrop〜によるドラッグアンドドロップ操作は不要です。



MouseUPに入れればいいということでしょうか?(↑60809)

これだと、ドロップ可能場所に入ったかどうかがわかりにくいので、できたら・・・と思ったのですが。。

引用返信 編集キー/
■60819 / inTopicNo.10)  Re[7]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ shu (869回)-(2011/07/20(Wed) 09:06:11)
No60818 (やんまー さん) に返信
> shu さん
>
>
> >>Moveを以下のようにしているのですが、DragDropEffects の行を実行すると挙動が変になります。
>>
>>DoDragDrop〜によるドラッグアンドドロップ操作は不要です。
>
>
>
> MouseUPに入れればいいということでしょうか?(↑60809)
>
> これだと、ドロップ可能場所に入ったかどうかがわかりにくいので、できたら・・・と思ったのですが。。
>

Mouseの座標で対象コントロール上か判断(PictureBox1のMouse系イベントにて)
If ListBox1.ClientRectangle.Contains(ListBox1.PointToClient(PictureBox1.PointToScreen(e.Location))) Then
ListBox1上にマウスカーソル有
Else
ListBox1上にマウスカーソル無
End If

MouseUpでの判断もこれでいいかも。

引用返信 編集キー/
■60837 / inTopicNo.11)  Re[8]: ドラッグ&ドロップと移動を同時にやる方法
□投稿者/ やんまー (69回)-(2011/07/20(Wed) 18:38:35)
2011/07/20(Wed) 18:59:40 編集(投稿者)
shu さん

ありがとうございます!


おっしゃっていた「ドラッグドロップ処理がいらない」の意味がようやくわかりました 汗

単にリストボックスの上でマウスアップしたら、addすればいいですね。


以下のようにして、やっと思っていたような動きになりました!




---
	Sub PictureBox3MouseUp(sender As Object, e As MouseEventArgs)
		If ListBox1.ClientRectangle.Contains(ListBox1.PointToClient(pictureBox3.PointToScreen(e.Location))) Then
			'ListBox1上にマウスカーソル有
			Debug.Print("D drop")
			
			'インスタンスを作成(part1)
			
			ListBox1.Items.Add(part1)
			
		Else
			'ListBox1上にマウスカーソル無
			Debug.Print("D NG drop")
		End If
       '左クリックの場合
        If e.Button = MouseButtons.Left Then
            'コントロール取得
            Dim control As Control = CType(sender, Control)
            'コントロールの位置を設定
            control.Left = x座標
            control.Top = Y座標
            'リフレッシュ
            Me.Refresh()
        End If
	End Sub

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -