■80988 / inTopicNo.11) |
Re[2]: タブページをドラッグしてウインドウを動かす方法 |
□投稿者/ 魔界の仮面弁士 (839回)-(2016/08/23(Tue) 11:27:34)
|
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 についても、列や行のリサイズを可能にしている場合、 座標判定して、リサイズ時は除外するなどの必要が生じるかと思います。
|
解決済み
|