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

解決


2HD  2003-03-06 01:34:18  No: 77309

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


VBレスキュ−(花ちゃん)  URL  2003-03-06 01:44:57  No: 77310

GetWindowLong
SetWindowLong
WS_THICKFRAME

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


たかみちえ  URL  2003-03-06 03:11:52  No: 77311

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

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


2HD  2003-03-06 18:46:28  No: 77312

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

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

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


juice  2003-03-07 04:08:33  No: 77313

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

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

以下がリサイズのソースです。
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-07 06:04:37  No: 77314

うほっ!

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

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

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


VBレスキュ-(花ちゃん)  URL  2003-03-07 08:31:01  No: 77315

移動は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 19:01:04  No: 77316

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


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

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






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