C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 161 を表示中)
■93063 / )  Re[12]: TrackBarでクリックした位置に移動する方法
□投稿者/ 小次郎 (13回)-(2019/11/18(Mon) 12:16:47)
ありがとうございます。


SignedHIWORDに関してですが、元のコードでも動作していますが、
何が違いますか?


いまのところ、以下のコードで動作しています。


        Protected Overrides Sub WndProc(ByRef m As Message)

            If m.Msg = WM_LBUTTONDOWN Then

                Dim x As Integer = SignedLOWORD(m.LParam)
                Dim y As Integer = SignedHIWORD(m.LParam)


                Dim channel As Rectangle = GetChanelRectangle()

                Dim TrackBar1_Maximum As Integer = GetRangeMax()
                Dim TrackBar1_Minimum As Integer = GetRangeMin()

                If x < channel.Left Then

                    Call SetSliderPosi(TrackBar1_Minimum)

                ElseIf x > channel.Right Then

                    Call SetSliderPosi(TrackBar1_Maximum)

                Else

                    Dim ticWidth As Double = channel.Width / (TrackBar1_Maximum - TrackBar1_Minimum)
                    Dim SetPosi As Integer = CInt((x - channel.Left) / ticWidth) + TrackBar1_Minimum
                    Call SetSliderPosi(SetPosi)

                End If

                Call frm.TrackBar1_ValueChanged(frm.TrackBar1, Nothing)


                m.Result = IntPtr.Zero
                Return
            ElseIf m.Msg = WM_LBUTTONUP Then

                Dim ggg = 0


            ElseIf m.Msg = WM_MOUSEMOVE Then


                If (Control.MouseButtons And MouseButtons.Left) = MouseButtons.Left Then

                Else

                    m.Result = IntPtr.Zero
                    Return

                End If

            End If
            MyBase.WndProc(m)
        End Sub



ただ、問題は、スライダーをドラッグ操作できないことです。

マウスボタンが押されたとき、押された位置がつまみなら普通の処理、
そうでなければ上記のコードを実行したいのですが、
つまみの上かどうかはどのようにして判定したら良いですか?

地道に、現在位置のつまみの位置を求めて、現在のつまみの位置と比較するしかないですか?
Tickの刻みが細かい場合には良いですが
荒い場合には、ずれてしまうと思うのですが。


あと、別の質問ページでも質問させていただきましたが、

    Private Sub TrackBar1_ValueChanged(sender As Object, e As EventArgs) Handles TrackBar1.ValueChanged

		' 計算処理

    End Sub

のところで、処理が重い場合に、
マウスをアップしたとしても
ElseIf m.Msg = WM_LBUTTONUP Then
が実行されない場合がある現象が起きています。

つまり、マウスから手を離していてもドラッグしていると認識されて、スライダーがマウスカーソルにひっついてきます。

そのため、対症療法的ですが、
            ElseIf m.Msg = WM_MOUSEMOVE Then


                If (Control.MouseButtons And MouseButtons.Left) = MouseButtons.Left Then

                Else

                    m.Result = IntPtr.Zero
                    Return

                End If

で対処しているのですが、
 If m.Msg = WM_LBUTTONDOWN Then

を実行した後に、マウスアップを自分で実行するにはどうしたら良いですか?

返信 編集キー/


管理者用

- Child Tree -