|
そりゃーあーた タブの中に入ってたらタブの中でしか表示されない。 フォームをちっさくしても、フォーム内のコントロールがフォームからはみ出して表示されないでしょ。 それと一緒。
コントロールは、親のコントロールの描画範囲でしか描画されない。 なので、コントロールの親をフォームにすれば、フォームの描画範囲内で描画できるようになる。
やり方としては、 マウスダウンイベントで、ボタンコントロールをタブコントロール(ただしくはタブページコントロール)の子コントロールからはずし、 フォームの子コントロールに追加する(さらに順番を一番上に設定)。 マウスアップイベントで、ボタンコントロールをフォームの子コントロールからはずし、 ピクチャーボックスの子コントロールに追加すれば移動処理は終了。 気をつけなければならないのがボタンの位置。 親を変えたとしても、位置座標は変わらないため、タブコントロール内でボタンコントロールの位置が(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
|