現在、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
これが現在書いているコードです。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.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
によって制限させていたのですが、どのように変更させればよいでしょうか?
よろしくお願いします。
No.2
- 回答日時:
' 親パネルの 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
No.1
- 回答日時:
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」部分にエラーがでてしまいます。
解決策がわかりません。丸投げで申し訳ないのですが、教えていただけると幸いです。
お時間がありましたら、お返事おねがいします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
エクセルで回転する座標の出し方
-
閉図形の座標の配列が右回りか...
-
エクセルである点からの距離で...
-
エクセルシート上のマウスポイ...
-
ダイアログ内コントロールの位...
-
以下のプログラムは重心を求め...
-
visualbasic でform上に正三角...
-
ワード上Shapeの位置情報を統一...
-
Excel VBA で自在に図形を変化...
-
碁盤目の経路数
-
6点からの楕円の近似計算(最...
-
空間上の二点を結ぶ直線上に任...
-
c言語でキーボードから2点の座...
-
始点、終点の二つの座標と半径...
-
(C言語)スキャンライン法によ...
-
座標を持った平面範囲に座標を...
-
VB6のPrinter.ScaleWidth に対...
-
円弧の描画について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マインクラフト(pc版)で座標...
-
グラフの交点の求め方(Excel)
-
エクセルで回転する座標の出し方
-
閉図形の座標の配列が右回りか...
-
3次元空間上の2つの座標から...
-
エクセルである点からの距離で...
-
求積表の計算方法
-
ダイアログ内コントロールの位...
-
空間上の二点を結ぶ直線上に任...
-
始点、終点の二つの座標と半径...
-
図形が重なりあっているかどうか
-
ワード上Shapeの位置情報を統一...
-
以下のプログラムは重心を求め...
-
シーケンサー(PLC?)で制...
-
ピクチャボックスの座標取得
-
多角形の内部かどうか判定する方法
-
Excel VBA で自在に図形を変化...
-
選択範囲の座標値の抽出
-
座標を持った平面範囲に座標を...
-
VBで、開いているExcelシートの...
おすすめ情報