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

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

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

Re[4]: タブコントロール中のボタンのドラッグアンドドロップについて


(過去ログ 65 を表示中)

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

■37528 / inTopicNo.1)  タブコントロール中のボタンのドラッグアンドドロップについて
  
□投稿者/ qqa (1回)-(2009/06/24(Wed) 15:48:03)

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

分類:[VB2005] 

開発環境Windows XP VB2005です。

フォーム上にタブコントロールを1個、PictureBoxを1つ配置し、タブコントロール中にボタンをいくらか配置しました。
タブコントロール中のボタンをPictureBoxにDrag&Dropすると、タブコントロールの外にボタンを移動させると見えなくなり、Dropできません。
タブコントロールからボタンを出して、フォーム上で視認できるようにしてPictureBoxまでDrag&Dropしたいのですが…。

宜しくお願いします。





//ソースコード
  Dim IsDragging As Boolean               'ドラッグ中の場合True
    Dim DiffPoint As Point                  'ドラッグ開始地点とドラッグ開始時のボタンの位置とのずれ

    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)   Handles Button1.MouseDown
        
        If e.Button = Windows.Forms.MouseButtons.Left Then      
            IsDragging = True
            DiffPoint = New Point(e.X, e.Y)
        End If

    End Sub

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

        If IsDragging Then

            Dim DestX As Integer = Button1.Location.X + e.X - DiffPoint.X
            Dim DestY As Integer = Button1.Location.Y + e.Y - DiffPoint.Y

            Button1.Location = New Point(DestX, DestY)

        End If

    End Sub

    Private Sub Button1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)    Handles Button1.MouseUp

        If e.Button = Windows.Forms.MouseButtons.Left Then
            IsDragging = False
        End If

    End Sub


//
以上です。


引用返信 編集キー/
■37547 / inTopicNo.2)  Re[1]: タブコントロール中のボタンのドラッグアンドドロップについて
□投稿者/ gtk2k (8回)-(2009/06/24(Wed) 21:13:15)
そりゃーあーた
タブの中に入ってたらタブの中でしか表示されない。
フォームをちっさくしても、フォーム内のコントロールがフォームからはみ出して表示されないでしょ。
それと一緒。

コントロールは、親のコントロールの描画範囲でしか描画されない。
なので、コントロールの親をフォームにすれば、フォームの描画範囲内で描画できるようになる。

やり方としては、
マウスダウンイベントで、ボタンコントロールをタブコントロール(ただしくはタブページコントロール)の子コントロールからはずし、
フォームの子コントロールに追加する(さらに順番を一番上に設定)。
マウスアップイベントで、ボタンコントロールをフォームの子コントロールからはずし、
ピクチャーボックスの子コントロールに追加すれば移動処理は終了。
気をつけなければならないのがボタンの位置。
親を変えたとしても、位置座標は変わらないため、タブコントロール内でボタンコントロールの位置が(10, 10)だったら、
フォームの子コントロールにしたら、フォームの(10, 10)に表示されてしまう。
なので、タブコントロール内の(10, 10)の位置が、フォーム内でのどの位置なのかを取得し、
ボタンコントロールの親をフォームにした直後に設定しないといけない。
同様に、ボタンコントロールをピクチャーボックスにドロップしたときは、親をピクチャーボックスに変更し、
変更直後にボタンコントロールの位置がピクチャーボックス内でどの位置になるかを取得し設定する。
イベントバブルを正しく行わせるようにするためには、ピクチャーボックスの子コントロールにした後に、
ボタンの親をピクチャーボックスだという設定をする。

Private isDragging As Boolean
Private mPoint As Point
Private editMode As Boolean = True
Private dropControl As Control
Private oldParent As Control
Private oldPosition As Point

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler Button1.MouseDown, AddressOf Control_MouseDown
AddHandler Button1.MouseMove, AddressOf Control_MouseMove
AddHandler Button1.MouseUp, AddressOf Control_MouseUp
AddHandler Button2.MouseDown, AddressOf Control_MouseDown
AddHandler Button2.MouseMove, AddressOf Control_MouseMove
AddHandler Button2.MouseUp, AddressOf Control_MouseUp
dropControl = PictureBox1
End Sub

Private Sub Control_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If editMode Then
Dim ctl As Control = DirectCast(sender, Control)
oldPosition = ctl.Location
Dim p As Point = Me.PointToClient(ctl.PointToScreen(New Point(0, 0)))
oldParent = ctl.Parent
oldParent.Controls.Remove(ctl)
Me.Controls.Add(ctl)
ctl.BringToFront()
ctl.Location = p
isDragging = True
mPoint = e.Location
End If
End Sub

Private Sub Control_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim ctl As Control = DirectCast(sender, Control)
If editMode And isDragging Then
ctl.Left += e.X - mPoint.X
ctl.Top += e.Y - mPoint.Y
End If
End Sub

Private Sub Control_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseUp
Dim ctl As Control = DirectCast(sender, Control)
If editMode And e.Button = Windows.Forms.MouseButtons.Left Then
Dim p As Point = dropControl.PointToClient(Control.MousePosition)
p.Offset(-mPoint.X, -mPoint.Y)
Me.Controls.Remove(ctl)
dropControl.Controls.Add(ctl)
ctl.Parent = PictureBox1
ctl.Location = p
isDragging = False
End If
End Sub
引用返信 編集キー/
■37655 / inTopicNo.3)  Re[2]: タブコントロール中のボタンのドラッグアンドドロップについて
□投稿者/ qqa (2回)-(2009/06/26(Fri) 15:25:26)
2009/06/26(Fri) 15:26:07 編集(投稿者)


ありがとうございます。
思っていた動きに近くできました。


同じ種類のボタンを何回も使いたいので、ボタンを動かしたときに、タブコントロールの元の場所に同じボタンを次々復元できるようにしたいのですが…。
何かいい方法があれば、よろしくお願いします。

引用返信 編集キー/
■37663 / inTopicNo.4)  Re[3]: タブコントロール中のボタンのドラッグアンドドロップについて
□投稿者/ gtk2k (11回)-(2009/06/26(Fri) 15:48:35)
復元させるのではなく、ドラッグアンドドロップするボタンを新しく追加させればいい。

Private isDragging As Boolean
Private mPoint As Point
Private editMode As Boolean = True
Private dropControl As Control

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' タブコントロール上のボタンのイベントハンドらはマウスダウンイベントのみ設定
AddHandler Button1.MouseDown, AddressOf Control_MouseDown
dropControl = PictureBox1
End Sub

Private Sub Control_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If editMode Then
Dim ctl As Control = DirectCast(sender, Control)
Dim p As Point = Me.PointToClient(ctl.PointToScreen(New Point(0, 0)))
' ボタンを作成し、サイズおよびテキストプロパティをタブコントロール上のボタンにあわせる
Dim btn As New Button()
btn.Text = ctl.Text
btn.Size = ctl.Size
' 位置を設定
btn.Location = p
Me.Controls.Add(btn)
btn.BringToFront()
' イベントハンドラを設定
AddHandler btn.MouseMove, AddressOf Control_MouseMove
AddHandler btn.MouseUp, AddressOf Control_MouseUp
' タブコントロール上のボタンコントロールにマウスイベント
' をキャプチャされているため新しく作ったボタンにマウスイベントをキャプチャさせる
btn.Capture = True
isDragging = True
mPoint = e.Location
End If
End Sub

Private Sub Control_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim ctl As Control = DirectCast(sender, Control)
If editMode And isDragging Then
ctl.Left += e.X - mPoint.X
ctl.Top += e.Y - mPoint.Y
End If
End Sub

Private Sub Control_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseUp
Dim ctl As Control = DirectCast(sender, Control)
If editMode And e.Button = Windows.Forms.MouseButtons.Left Then
Dim p As Point = dropControl.PointToClient(Control.MousePosition)
p.Offset(-mPoint.X, -mPoint.Y)
Me.Controls.Remove(ctl)
dropControl.Controls.Add(ctl)
ctl.Parent = dropControl
' イベントハンドラを解除する
RemoveHandler ctl.MouseMove, AddressOf Control_MouseMove
RemoveHandler ctl.MouseUp, AddressOf Control_MouseUp
ctl.Location = p
isDragging = False
End If
End Sub
引用返信 編集キー/
■37793 / inTopicNo.5)  Re[4]: タブコントロール中のボタンのドラッグアンドドロップについて
□投稿者/ qqa (3回)-(2009/06/30(Tue) 15:16:10)
ありがとうございます。
度々、すみません。

PictureBoxにボタンをD&Dさせた後も自由にPictureBox内でボタンを動かすにはどうすればいいのでしょうか?
また、PictureBox外にボタンが出された時には、そのボタンを消すようにしたいのですが…。

後、
DirectCast(sender,Control)
はどのような型変換を行っているのでしょうか?

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -