| 
          
            □投稿者/ 魔界の仮面弁士 (839回)-(2016/08/23(Tue) 11:27:34)
              | ■80988 / inTopicNo.11) | Re[2]: タブページをドラッグしてウインドウを動かす方法 |  
 
          
            
              
                |  | 2016/08/23(Tue) 18:53:11 編集(投稿者) 
 # New Message() から Message.Create() なコードに差し替えました
 
 
 ■No80964 (よっしー さん) に返信
 > Private Sub TabPage1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TabPage1.MouseMove
 >   If e.Button = MouseButtons.Left Then
 >     Call ReleaseCapture()
 >     Call SendMessage(Me.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
 >   End If
 > End Sub
 
 参考までに、Declare 宣言無しで記述する方法も書いておきます。
 
 Private Sub DragMove(ByVal sender As Object, ByVal e As MouseEventArgs)
 If e.Button = MouseButtons.Left Then
 ' Call ReleaseCapture()
 DirectCast(sender, Control).Capture = False
 
 ' Call SendMessage(Me.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
 WndProc(Message.Create(Handle, &HA1, New IntPtr(2), IntPtr.Zero))
 End If
 End Sub
 
 
 ついでに、コントロールを再帰的に列挙する例も載せておきます。
 NumericUpDown 内の UpDownButtons などといった
 非公開の内部コントロールも列挙されますので御注意下さい。
 
 
 ' Iterator Function を使うには、VB2012 以降が必要です
 Private Iterator Function EnumControls(owner As Control) As IEnumerable(Of Control)
 Yield owner
 For Each c In owner.Controls.Cast(Of Control).SelectMany(AddressOf EnumControls)
 Yield c
 Next
 End Function
 
 
 
 ■No80974 (よっしー さん) に返信
 > あと、ComboboxやTextboxを除外したいのですがどうすれば良いですか?
 
 Dim q = From c In EnumControls(Me) _
 Where TypeOf c IsNot TextBoxBase AndAlso _
 TypeOf c IsNot ComboBox AndAlso _
 TypeOf c IsNot TrackBar AndAlso _
 TypeOf c IsNot Splitter AndAlso _
 TypeOf c IsNot SplitContainer
 
 For Each c In q
 AddHandler c.MouseMove, AddressOf DragMove
 Next
 
 
 ・WebBrowser は MouseMove イベントを通知しないため、
 この方法は使えません。WebBrowser でマウス操作を
 取得する方法については、下記を参照して下さい。
 http://dobon.net/vb/bbs/log3-37/22769.html
 
 ・TrackBar は、つまみ以外の場所はドラッグ可能に
 したかったのですが、判定条件が分かりませんでした…。
 
 ・DataGridView についても、列や行のリサイズを可能にしている場合、
 座標判定して、リサイズ時は除外するなどの必要が生じるかと思います。
 
 |  解決済み |