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

わんくま同盟

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

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


(過去ログ 161 を表示中)
■93034 / )  Re[3]: TrackBarでクリックした位置に移動する方法
□投稿者/ mayo (1回)-(2019/11/16(Sat) 11:41:26)
No93033 (小次郎 さん) に返信

1つ前のTrackBar1.ValueをPrivate変数で保持しておいてMouseDownイベント内で値に変化があったら
TrackBar1_ValueChangedメソッド実行という流れでどうでしょう?
目盛のパディングを8で決め打ちにされていますが、これはまずいと思います。
TBM_GETCHANNELRECTをSendMessageすることで、目盛領域を得られるので、そこから計算するのが良いと思います。

以下でどうでしょう?

Imports System.Runtime.InteropServices
Public Class Form1
    Private oldValue As Integer
    Private channel As Rectangle
    Private Structure RECT
        Public left, top, right, bottom As Integer
    End Structure
    <DllImport("user32.dll", EntryPoint:="SendMessage")>
    Private Shared Function SendMessageRect(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wp As IntPtr, ByRef lp As RECT) As IntPtr
    End Function
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        oldValue = TrackBar1.Minimum
        TrackBar1.Value = TrackBar1.Minimum
        channel = GetChanelRectangle(TrackBar1)
    End Sub
    Private Sub TrackBar1_ValueChanged()
        ' 計算処理
        MsgBox($"ValueChanged: {TrackBar1.Value}")
    End Sub
    Private Function GetChanelRectangle(trackbar As TrackBar) As Rectangle
        Const TBM_GETCHANNELRECT As Integer = &H400 + 26
        Dim rc As RECT = New RECT()
        SendMessageRect(trackbar.Handle, TBM_GETCHANNELRECT, IntPtr.Zero, rc)
        Return New Rectangle(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top)
    End Function
    Private Sub TrackBar1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TrackBar1.MouseDown
        If e.X < channel.Left Then
            TrackBar1.Value = TrackBar1.Minimum
        ElseIf e.X > channel.Right Then
            TrackBar1.Value = TrackBar1.Maximum
        Else
            Dim ticWidth As Double = channel.Width / (TrackBar1.Maximum - TrackBar1.Minimum)
            TrackBar1.Value = CInt((e.X - channel.Left) / ticWidth) + TrackBar1.Minimum
        End If
        If oldValue <> TrackBar1.Value Then
            TrackBar1_ValueChanged()
        End If
        oldValue = TrackBar1.Value
    End Sub
End Class

返信 編集キー/


管理者用

- Child Tree -