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

わんくま同盟

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

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

■96244 / 3階層)  トラックバーの一部に色を付ける方法
□投稿者/ KOZ (146回)-(2020/11/05(Thu) 14:49:53)
No96240 (KOZ) に返信

あーすみません、全部描画したほうが楽な気がしてきました。

Imports System.Runtime.InteropServices

Public Class TrackBarEx
    Inherits TrackBar

    Private Const WM_USER As Integer = &H400
    Private Const TBM_GETPOS As Integer = WM_USER               'スライダーの位置を取得
    Private Const TBM_GETRANGEMIN As Integer = WM_USER + 1      'スライダーの位置の最小位置の取得
    Private Const TBM_GETRANGEMAX As Integer = WM_USER + 2      'スライダーの位置の最大位置の取得
    Private Const TBM_GETTIC As Integer = WM_USER + 3           '特定のチックマークの位置を取得
    Private Const TBM_SETTIC As Integer = WM_USER + 4           '特定のチックマークの位置を設定
    Private Const TBM_SETPOS As Integer = WM_USER + 5           'スライダーの位置を設定
    Private Const TBM_SETRANGE As Integer = WM_USER + 6         'スライダー位置の可変範囲の設定
    Private Const TBM_SETRANGEMIN As Integer = WM_USER + 7      'スライダー位置の可変範囲の最小値の設定
    Private Const TBM_SETRANGEMAX As Integer = WM_USER + 8      'スライダー位置の可変範囲の最大値の設定
    Private Const TBM_CLEARTICS As Integer = WM_USER + 9        '現在のチックマークを削除
    Private Const TBM_SETSEL As Integer = WM_USER + 10          'チックマークの選択範囲の設定
    Private Const TBM_SETSELSTART As Integer = WM_USER + 11     'チックマークの選択範囲の終了値の設定
    Private Const TBM_SETSELEND As Integer = WM_USER + 12       'チックマークの選択範囲の開始値の設定
    Private Const TBM_GETPTICS As Integer = WM_USER + 14        'チックマーク位置を示す配列を指すポインタの取得
    Private Const TBM_GETTICPOS As Integer = WM_USER + 15       'チックマークの物理位置の取得
    Private Const TBM_GETNUMTICS As Integer = WM_USER + 16      'チックマークの数の取得
    Private Const TBM_GETSELSTART As Integer = WM_USER + 17     '選択範囲の開始位置の取得
    Private Const TBM_GETSELEND As Integer = WM_USER + 18       '選択範囲の終了位置の取得
    Private Const TBM_CLEARSEL As Integer = WM_USER + 19        '選択範囲の解除
    Private Const TBM_SETTICFREQ As Integer = WM_USER + 20      'チックマークの間隔の設定
    Private Const TBM_SETPAGESIZE As Integer = WM_USER + 21     'ページサイズの設定
    Private Const TBM_GETPAGESIZE As Integer = WM_USER + 22     'ページサイズの取得
    Private Const TBM_SETLINESIZE As Integer = WM_USER + 23     'ラインサイズの設定
    Private Const TBM_GETLINESIZE As Integer = WM_USER + 24     'ラインサイズの取得
    Private Const TBM_GETTHUMBRECT As Integer = WM_USER + 25    'つまみの境界矩形の取得
    Private Const TBM_GETCHANNELRECT As Integer = WM_USER + 26  'スライダーが動くチャンネルの境界矩形の取得
    Private Const TBM_SETTHUMBLENGTH As Integer = WM_USER + 27  'つまみの長さの設定
    Private Const TBM_GETTHUMBLENGTH As Integer = WM_USER + 28  'つまみの長さの取得

    Private Structure RECT
        Public left, top, right, bottom As Integer

        Public Shared Narrowing Operator CType(ByVal r As RECT) As Rectangle
            Return Rectangle.FromLTRB(r.left, r.top, r.right, r.bottom)
        End Operator

    End Structure

    <DllImport("user32.dll", CharSet:=CharSet.Auto)>
    Private Shared Function SendMessage(ByVal hWnd As IntPtr,
                                        ByVal Msg As Integer,
                                        ByVal wParam As IntPtr,
                                        ByRef rect As RECT) As IntPtr
    End Function

    Public Sub New()
        MyBase.New()
        SetStyle(ControlStyles.UserPaint, True)
        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
    End Sub

    Protected Overrides Sub OnValueChanged(e As EventArgs)
        MyBase.OnValueChanged(e)
        MyBase.Invalidate()
    End Sub

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        e.Graphics.FillRectangle(Brushes.DarkGray, ClientRectangle)

        Dim r As New RECT()
        SendMessage(Me.Handle, TBM_GETCHANNELRECT, IntPtr.Zero, r)
        Dim channel As Rectangle = r
        e.Graphics.FillRectangle(Brushes.Black, channel)

        SendMessage(Me.Handle, TBM_GETTHUMBRECT, IntPtr.Zero, r)
        Dim thumb As Rectangle = r
        If thumb.Left > channel.Left Then
            Dim leftchannel As New Rectangle(channel.Left, channel.Top, thumb.Left - channel.Left, channel.Height)
            e.Graphics.FillRectangle(Brushes.Red, leftchannel)
        End If
        e.Graphics.DrawRectangle(Pens.White, channel)

        e.Graphics.FillEllipse(Brushes.White, thumb)
    End Sub

End Class

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: トラックバーの一部に色を付ける方法 /KOZ →Re[4]: トラックバーの一部に色を付ける方法 /鮭
 
上記関連ツリー

トラックバーの一部に色を付ける方法 / 鮭 (20/11/03(Tue) 20:55) #96227
Re[1]: トラックバーの一部に色を付ける方法 / 鮭 (20/11/03(Tue) 21:15) #96228
  └ Re[2]: トラックバーの一部に色を付ける方法 / KOZ (20/11/05(Thu) 08:57) #96240
    └ トラックバーの一部に色を付ける方法 / KOZ (20/11/05(Thu) 14:49) #96244 ←Now
      └ Re[4]: トラックバーの一部に色を付ける方法 / 鮭 (20/11/05(Thu) 21:42) #96250
        └ Re[5]: トラックバーの一部に色を付ける方法 / KOZ (20/11/06(Fri) 09:07) #96251
          └ Re[6]: トラックバーの一部に色を付ける方法 / KOZ (20/11/06(Fri) 11:47) #96254
            └ Re[7]: トラックバーの一部に色を付ける方法 / 鮭 (20/11/06(Fri) 18:00) #96255
              └ Re[8]: トラックバーの一部に色を付ける方法 / 魔界の仮面弁士 (20/11/06(Fri) 18:12) #96256
                └ Re[9]: トラックバーの一部に色を付ける方法 / 鮭 (20/11/06(Fri) 22:47) #96257
                  └ Re[10]: トラックバーの一部に色を付ける方法 / 魔界の仮面弁士 (20/11/07(Sat) 01:08) #96258
                    └ Re[11]: トラックバーの一部に色を付ける方法 / 鮭 (20/11/07(Sat) 11:04) #96263
                      └ Re[12]: トラックバーの一部に色を付ける方法 / KOZ (20/11/09(Mon) 09:13) #96274
                        └ Re[13]: トラックバーの一部に色を付ける方法 / 鮭 (20/11/09(Mon) 20:45) #96287 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信