実行後にコントロールを自由に移動したい

解決


くらって  2004-10-02 23:16:46  No: 116726

お世話になります。
フォームに配置したコントロールを、実行後にも自由にドラッグアンドドロップ
で移動したいのですが(VBのIDEのように)、うまくいきません。
とりあえずコマンドボタンでやってみました。
コマンドボタンのMouseDownイベントでフラグを真にして、
MouseMoveイベントでフラグが真であればコマンドボタンのLeft,TopプロパティそれぞれにX座標とY座標を代入して、
MouseUpイベントでフラグを偽にするようにしました。
しかし実行していざドラッグをはじめると、一応うまくいくのですが、
ボタンが分裂して表示されてしまいます。
また、このやり方だと、全てのコントロールの各Mouseイベントに同様の記述をしなければならず、煩雑です。
なんとかうまいやり方はありませんでしょうか?
よろしくお願いします。


くらって  2004-10-02 23:18:35  No: 116727

またぽかをやってしまいました。申し訳ありません。><
環境は、Windows98SE,VB6.0SP6です。
よろしくお願いします。


特攻隊長まるるう  2004-10-02 23:49:28  No: 116728

>ボタンが分裂して表示されてしまいます。
過去ログ検索『再描画』で引っかかるような内容で解決できると
思います。
>また、このやり方だと、全てのコントロールの各Mouseイベントに同様の記述をしなければならず、煩雑です。
共通関数を呼び出すのも許さないレベルの話ですか?


くらって  2004-10-03 01:48:48  No: 116729

>特攻隊長まるるうさん
再描画で検索して一通り目を通しましたがどれが必要な情報なのか
理解できませんでした。

ラベルの最適な表示方法は?http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200304/03040087.txt
↑を参考に、
Command1_MouseMoveイベントで、
With Command1
  If flag = True Then
    .Visible = False
    .Move X,Y
    .Visible = True
  End If
End With
とやってみましたが、やはりCommand1ドラッグ時上下二つに分裂(もともとのCommand1とその上にもうひとつ)して表示され、
ドロップ時に何故か分裂した上側の位置に移動されてしまいます。
何か決定的な勘違いをしている気がします。
アドバイスをお願いします。
何度もすみません、


特攻隊長まるるう  2004-10-03 02:54:38  No: 116730

ああ、そっか(^^;)こっちで再現しないので困ってたんですが、
X ,Y の基準がボタンの .Top .Left ですね、ボタンのイベントだから。
移動する時はフォームの .Top .Left が基準です。で、2箇所をガンガン
動きまくってます。ボタンをフォームの左上の隅に配置し、少しだけ
ドラッグしてると分裂してる差がほとんど無くなるでしょ?
[VB6.0]
With Command1
  If flag = True Then
    Debug.Print X & "," & Y
    .Move X, Y
  End If
End With

例えば、
[Vb6.0]
With Command1
  If flag = True Then
    Debug.Print X & "," & Y
    .Move .Left + X, .Top + Y
  End If
End With
でそれらしく動くと思います。


DRAG息子  2004-10-03 05:12:33  No: 116731

DragDropを使用して、Label1 と Picture1 の各コントロール
を移動するサンプルを作ってみました。
Command1, Command2 で移動の許可/禁止を切り替えます。

Option Explicit

Private m_bCanMove As Boolean
Private m_dx As Single
Private m_dy As Single

Private Sub Ctrl_DragDrop(oCtrl As Object, Source As Control, X As Single, Y As Single)
    If (m_bCanMove) Then
        If (oCtrl Is Source) Then
            Source.Move Source.Left + X - m_dx, Source.Top + Y - m_dy
        Else
            Source.Move oCtrl.Left + X - m_dx, oCtrl.Top + Y - m_dy
        End If
    End If
End Sub

Private Sub Ctrl_MouseDown(oCtrl As Object, X As Single, Y As Single)
    If (m_bCanMove) Then
        oCtrl.Drag vbBeginDrag
        m_dx = X
        m_dy = Y
    End If
End Sub

Private Sub Command1_Click()
    m_bCanMove = True  ' 移動許可
End Sub

Private Sub Command2_Click()
    m_bCanMove = False  ' 移動禁止
End Sub

Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
    If (m_bCanMove) Then
        Source.Move X - m_dx, Y - m_dy
    End If
End Sub

Private Sub Label1_DragDrop(Source As Control, X As Single, Y As Single)
    Call Ctrl_DragDrop(Label1, Source, X, Y)
End Sub

Private Sub Label1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Call Ctrl_MouseDown(Label1, X, Y)
End Sub

Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single)
    Call Ctrl_DragDrop(Picture1, Source, X, Y)
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Call Ctrl_MouseDown(Picture1, X, Y)
End Sub


くらって  2004-10-05 21:19:18  No: 116732

>特攻隊長まるるうさん
>DRAG息子さん
お二人のやり方で無事解決いたしました。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加