ドラッグで移動・サイズ変更可能なコントロールを作成するには?

解決


2HD  2003-03-05 16:34:18  No: 77309  IP: [192.*.*.*]

実行中のフォーム上で移動及びサイズ変更可能なコントロールを
作成したいのですが、その方法が全く分かりません。
ヒントだけでもお願いします。

編集 削除
VBレスキュ−(花ちゃん)  URL  2003-03-05 16:44:57  No: 77310  IP: [192.*.*.*]

GetWindowLong
SetWindowLong
WS_THICKFRAME

をキーワードにGoogleで検索して見て下さい

編集 削除
たかみちえ  URL  2003-03-05 18:11:52  No: 77311  IP: [192.*.*.*]

うちの旧学校の今執筆中の文章に書いているんですけど、
  もしかしたら、SendMessageで、WM_NCLBUTTONDOWNを送ることで、
サイズ変更とかができるようになるかもしれません。
  このメッセージをフォームに送ると、タイトルバー(非クライアント領域)でなくてもフォームを動かしたりできるようになります。
  すべてのウィンドウに非クライアント領域がある(隠されているだけ)と考えた場合、
これを応用して、どのウィンドウ(子ウィンドウ)でも動かせると思うんですが…。

くわしくはWM_NCLBUTTONDOWNを調べてみてください。

編集 削除
2HD  2003-03-06 09:46:28  No: 77312  IP: [192.*.*.*]

おおっ!  何となくイメージがわきました。
ありがとうございます。

しかし、移動後の配置を保存することは可能か?
と思ってみたりして・・・。

早速チャレンジ開始!
ホントにありがとうございました。

編集 削除
juice  2003-03-06 19:08:33  No: 77313  IP: [192.*.*.*]

私も移動・サイズ変更できるコマンドボタンを作りたく、ここにきましたが、
サイズ変更できるようになっても、ドラッグで移動ができません。

どうしたらいいのでしょうか?

以下がリサイズのソースです。
Private Sub Command1_Click()

  ' ビューを作成する
    gb_ViewNum = gb_ViewNum + 1
    gb_Name = "ビュー" & gb_ViewNum

    Load Ope.cmdView(gb_ViewNum)
    Ope.cmdView(gb_ViewNum).ZOrder
    Ope.cmdView(gb_ViewNum).Visible = True
    Ope.cmdView(gb_ViewNum).Left = 6000
    Ope.cmdView(gb_ViewNum).Caption = "ビュー" & gb_ViewNum
    Show

    Dim lngWindowOldStyle     As Long
    Dim lngWindowNewStyle     As Long
    Dim lngWin32apiResultCode As Long
    
  ' ビューをリサイズ可にする
    With Ope.cmdView(gb_ViewNum)
        ' ウィンドウスタイルを取得
        lngWindowOldStyle = _
            GetWindowLong(.hWnd, _
                          GWL_STYLE)
        ' 新しいウィンドウスタイルを指定
        lngWindowNewStyle = _
            lngWindowOldStyle Or _
            WS_THICKFRAME
        ' 新しいウィンドウスタイルを設定
        lngWin32apiResultCode = _
            SetWindowLong(.hWnd, _
                          GWL_STYLE, _
                          lngWindowNewStyle)
        ' 新しいウィンドウスタイルを適用
        lngWin32apiResultCode = _
            SetWindowPos(.hWnd, _
                         0, _
                         0, 0, _
                         0, 0, _
                         SWP_NOSIZE Or _
                         SWP_NOMOVE Or _
                         SWP_NOZORDER Or _
                         SWP_DRAWFRAME)
        
    End With
    
    Unload Me
End Sub
SetWindowPosをどう使うかがよく分からないのです。

編集 削除
2HD  2003-03-06 21:04:37  No: 77314  IP: [192.*.*.*]

うほっ!

juiceさん、
http://www.vector.co.jp/soft/win95/prog/se154743.html
↑の中の「マウス」の中の「7.マウス操作でコントロールを移動する」。

おかげ様でとりあえず形になりました。ありがとうございました。
juiceさんも出来ましたよね??

今後ともよろしくお願いします。

編集 削除
VBレスキュ-(花ちゃん)  URL  2003-03-06 23:31:01  No: 77315  IP: [192.*.*.*]

移動はAPIを使用しなくてもできます。下記を試して見て下さい。

Option Explicit
Private XPos As Long
Private YPos As Long

Private Sub Command1_DragDrop(Source As Control, _
                                            X As Single, Y As Single)
'同一コントロール内でドロップした場合の補正
    Source.Move (Command1.Left + X - XPos), (Command1.Top + Y - YPos)
End Sub

Private Sub Command1_MouseDown(Button As Integer, _
                        Shift As Integer, X As Single, Y As Single)
'ドラッグ開始位置の保存とドラッグの開始
    YPos = Y
    XPos = X
    Command1.Drag vbBeginDrag
End Sub

Private Sub Form_DragDrop(Source As Control, _
                                    X As Single, Y As Single)
'フォーム上にドロップした時の補正
    Source.Move X - XPos, Y - YPos
End Sub

編集 削除
juice  2003-03-07 10:01:04  No: 77316  IP: [192.*.*.*]

2HDさん!できましたよ!!
ありがとうございます。
VBレスキュ-(花ちゃん)さんも感謝です。
ドロップ後の補正がよく分からなかったのですが、
理解できました。

編集 削除