アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、VisualBasic2010を用いてPanel1~Panel4をPanel5へ移動させて図形を作成させるコードを書いております。
今後Panel1~Panel4をPanel5だけでなく、Panel6,Panel7にも同様に移動させたいと考えておりますが、やりかたがわかりません。

画像はPanel5へ移動させたものです。同様に下に配置したPanel6へも移動させたいです。


わかる方がおられましたら、お力添えいただけると助かります。

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Panel5.AllowDrop = True

End Sub
Private Sub Panel1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown, Panel2.MouseDown, Panel3.MouseDown, Panel4.MouseDown
sender.DoDragDrop(sender, DragDropEffects.Move)
End Sub
Private Sub Panel5_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel5.DragDrop
Dim srsPnl As Panel = e.Data.GetData(GetType(Panel))
Dim dstPnl As New Panel
dstPnl.Size = srsPnl.Size
dstPnl.Location = Panel5.PointToClient(CursorPosition) 'New Point(e.X, e.Y)
dstPnl.BackColor = srsPnl.BackColor
AddHandler dstPnl.MouseDown, AddressOf dstPnl_MouseDown
AddHandler dstPnl.MouseMove, AddressOf dstPnl_MouseMove

Panel5.Controls.Add(dstPnl)
End Sub
Private Sub Panel5_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel5.DragEnter
If e.Data.GetDataPresent(GetType(Panel)) Then
e.Effect = DragDropEffects.Move
End If
End Sub
Private previousPos As Point
Private Sub dstPnl_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown
previousPos = CursorPosition()
End Sub
Private Sub dstPnl_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim nowPos As Point = CursorPosition()

DirectCast(sender, Panel).Left += nowPos.X - previousPos.X
DirectCast(sender, Panel).Top += nowPos.Y - previousPos.Y
Console.WriteLine(nowPos.X & "-" & previousPos.X)
previousPos = nowPos
End If
End Sub
Function CursorPosition() As Point
Return New Point(CInt(Cursor.Position.X / 10) * 10, CInt(Cursor.Position.Y / 10) * 10)
End Function

End Class

これが現在書いているコードです。

「VB2010において同様のイベントを設定」の質問画像

A 回答 (3件)

ごめんなさい DragDropの引数 e.X e.Yがスクリーン座標で渡されてきているのを変換するのを忘れていました



  ' 親パネルの DragDrop
  Sub PanelDragDrop(ByVal s As Object, ByVal e As DragEventArgs)
    Dim srsPanel As Panel = e.Data.GetData(GetType(Panel))
    Dim dstPanel As New Panel
    dstPanel.BackColor = srsPanel.BackColor
    dstPanel.Size = srsPanel.Size
    Dim pt As New Point(e.X, e.Y)
    ’ 親パネルの参照を追加
    Dim parent As Panel = s
    ’ スクリーン座標を 親パネルのクライアント座標に変換
    pt = parent.PointToClient(pt)
    ’ ドラッグ位置のオフセットを計算
    pt.Offset(-srcPt.X, -srcPt.Y)
    dstPanel.Location = pt
    AddHandler dstPanel.MouseDown, AddressOf Panel1_MouseDown
    DirectCast(s, Panel).Controls.Add(dstPanel)
  End Sub
といった具合です

この回答への補足

回答ありがとうございます。
複数のPanelに移動させることができるようになりました。


丸投げで申し訳ないのですが、私が書いていたコードでは、DragDropさせたPanelの座標を
dstPanel.Location = Panel4.PointToClient(CursorPosition)
のコードで取得していたのですが、作って頂いたコードでは
pt = parent.PointToClient(pt)
dstPanel.Location = pt
となっています。

DragDropさせたPanelの動きを
Function CursorPosition() As Point
Return New Point(CInt(Cursor.Position.X / 10) * 10, CInt(Cursor.Position.Y / 10) * 10)
End Function
によって制限させていたのですが、どのように変更させればよいでしょうか?

よろしくお願いします。

補足日時:2012/11/24 15:34
    • good
    • 0

' 親パネルの DragDrop


Sub PanelDragDrop(ByVal s as Object, ByVal e as DragEventArggs)
  dim srsPanel as Panel = e.Data.GetData(GetType(Panel))
  dim dstPanel as new Panel
  dstPanel.BackColor = srsPanel.BackColor
  dstPanel.Size = srsPanel.Size
  dim pt as New Point(e.X, e.Y)
  pt.Offset( -srcPt.X, -srcPt.Y )
  dstPanel.Location = pt
  AddHandler dstPanel.MouseDown, AddressOf Panel1_MouseDown
  ’ 引数が sなのに senderとしてしまいました …
  DirectCast(s, Panel).Controls.Add( dstPanel )
End Sub

この回答への補足

お返事ありがとうございます。
書いていただいたコードを用いて、やってみましたがPanelが動きません。
抜けている箇所、足りない箇所等ありましたら教えてください。


' ドラッグ時の座標保持用
Dim srcPt As Point
' ドラッグ先での移動用パネル
Dim srcPanel As Panel

' 親パネルの DragDrop
Sub PanelDragDrop(ByVal s As Object, ByVal e As DragEventArgs)
Dim srsPanel As Panel = e.Data.GetData(GetType(Panel))
Dim dstPanel As New Panel
dstPanel.BackColor = srsPanel.BackColor
dstPanel.Size = srsPanel.Size
Dim pt As New Point(e.X, e.Y)
pt.Offset(-srcPt.X, -srcPt.Y)
dstPanel.Location = pt
AddHandler dstPanel.MouseDown, AddressOf Panel1_MouseDown
DirectCast(s, Panel).Controls.Add(dstPanel)
End Sub

' 親パネルの DragEnter
Sub PanelDragEnter(ByVal s As Object, ByVal e As DragEventArgs)
If e.Data.GetDataPresent(GetType(Panel)) Then
e.Effect = DragDropEffects.Move
End If
End Sub

' 親パネルのMouseMove
Sub PanelMouseMove(ByVal s As Object, ByVal e As MouseEventArgs)
If srcPanel IsNot Nothing And e.Button = MouseButtons.Left Then
Dim p1 As New Point(e.X, e.Y)
p1.Offset(-srcPt.X, -srcPt.Y)
srcPanel.Location = p1
End If
End Sub

' 親パネルでのMouseUp
Sub PanelMouseUp(ByVal s As Object, ByVal e As MouseEventArgs)
If srcPanel IsNot Nothing And e.Button = MouseButtons.Left Then
srcPanel.Parent.Capture = False
srcPanel.BringToFront()
End If
End Sub

' 子パネルでの MouseMove
Sub Panel1_MouseDown(ByVal s As Object, ByVal e As MouseEventArgs) _
Handles Panel1.MouseDown, Panel2.MouseDown, Panel3.MouseDown, Panel4.MouseDown
Dim pnl As Panel = s
srcPanel = Nothing
If TypeOf pnl.Parent Is Panel Then
' ドロップ先での移動用
srcPt = New Point(e.X, e.y)
srcPanel = s
pnl.Parent.Capture = True
srcPanel.BringToFront()
Else
' GroupBoxからのD&D
pnl.DoDragDrop(pnl, DragDropEffects.Move)
End If
End Sub

' 親パネルのハンドラ登録メソッド
Sub myAddHandler(ByVal ParamArray prm() As Panel)
For Each pnl As Panel In prm
pnl.AllowDrop = True
AddHandler pnl.MouseMove, AddressOf PanelMouseMove
AddHandler pnl.MouseUp, AddressOf PanelMouseUp
AddHandler pnl.DragEnter, AddressOf PanelDragEnter
AddHandler pnl.DragDrop, AddressOf PanelDragDrop
Next
End Sub
Private previousPos As Point
Sub dstPnl_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown
previousPos = CursorPosition()
End Sub
Sub dstPnl_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim nowPos As Point = CursorPosition()

DirectCast(sender, Panel).Left += nowPos.X - previousPos.X
DirectCast(sender, Panel).Top += nowPos.Y - previousPos.Y
Console.WriteLine(nowPos.X & "-" & previousPos.X)
previousPos = nowPos
End If
End Sub
Function CursorPosition() As Point
Return New Point(CInt(Cursor.Position.X / 10) * 10, CInt(Cursor.Position.Y / 10) * 10)
End Function

Sub Form1_Load(ByVal s As Object, ByVal e As EventArgs) Handles MyBase.Load
myAddHandler(Panel5, Panel6)
End Sub

補足日時:2012/11/21 04:58
    • good
    • 0

DragEnterとDragDropイベントを少々手直しして


D&Dした先での移動に関しては Captureを親のパネルに設定して 親のパネルのMouseMoveイベントで行えばいいように思います

' ドラッグ時の座標保持用
dim srcPt as Point
’ ドラッグ先での移動用パネル
dim srcPanel as Panel

' 親パネルの DragDrop
Sub PanelDragDrop(ByVal s as Object, ByVal e as DragEventArggs)
  dim srsPanel as Panel = e.Data.GetData(GetType(Panel))
  dim dstPanel as new Panel
  dstPanel.BackColor = srsPanel.BackColor
  dstPanel.Size = srsPanel.Size
  dim pt as New Point(e.X, e.Y)
  pt.Offset( -srcPt.X, -srcPt.Y )
  dstPanel.Location = pt
  AddHandler dstPanel.MouseDown, AddressOf Panel1_MouseDown
  DirectCast(sender, Panel).Controls.Add( dstPanel )
End Sub

’ 親パネルの DragEnter
Sub PanelDragEnter(ByVal s as Object, ByVal e as DragEventArggs)
  if e.Data.GetDataPresent(GetType(Panel)) then
    e.Effect = DragDropEffects.Move
  end if
End Sub

’ 親パネルのMouseMove
Sub PanelMouseMove( ByVal s as Object,ByVal e as MouseEventArgs)
  if srcPanel isnot Nothing and e.Button = MouseBUtton.Left then
    dim p1 as new Point( e.X, e.Y)
    p1.Offset( -src.X, -srcPt.Y )
    srcPanel.Location = p1
  end if
End Sub

’ 親パネルでのMouseUp
Sub PanelMouseUp( s as Object, e as mouseEventArgs)
  if srcPanel isnot nothing and e.Button = mouseButton.Left then
    srcPanel.Parent.Capture = false
    srcPanel.BringToFront()
  end if
End Sub

' 子パネルでの MouseMove
Sub Panel1_MouseDown( s as Object, e as mouseEventArgs) _
handles Panel1.MouseDown,Panel2.MouseDown,Panel3.MouseDown,Panel4.MouseDown
  dim pnl as Panel = s
  srcPanel = nothing
  if TypeOf pnl.Parent is Panel then
    ’ ドロップ先での移動用
    srcPt = new Point(e.X, e.y)
    srcPanel = s
    pnl.Parent.Capture = true
    srcPanel.BringToFront()
  else
    ’ GroupBoxからのD&D
    pnl.DoDragDrop(pnl,DragDropEffects.Move)
  endif
End Sub

’ 親パネルのハンドラ登録メソッド
Sub myAddHandler(ByVal ParamArray prm() as Panel)
  for each pnl as Panel in prm
    pnl.AllowDrop = true
    AddHandler pnl.MouseMove, AddressOf PanelMouseMove
    AddHandler pnl.MouseUp, AddressOf PanelMouseUp
    AddHandler pnl.DragEnter, AddressOf PanelDragEnter
    AddHandler pnl.DragDrop, AddressOf PanelDragDrop
  next
end Sub

Sub Form1_Load(ByVal s as Object, e as EventArgs) handles Form1.Load
  MyAddHandler(Panel5, panel6, panel7, panel8)
End Sub

といった具合で いいかも …

この回答への補足

回答ありがとうございます。

' 親パネルの DragDrop
部分での
DirectCast(sender, Panel).Controls.Add(dstPanel)
において「sender」部分にエラーがでてしまいます。
解決策がわかりません。丸投げで申し訳ないのですが、教えていただけると幸いです。
お時間がありましたら、お返事おねがいします。

補足日時:2012/11/20 10:33
    • good
    • 0

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