vbAccelerator - Contents of code file: cSlider.ctl

VERSION 5.00
Begin VB.UserControl cSlider 
   ClientHeight    =   3600
   ClientLeft      =   0
   ClientTop       =   0
   ClientWidth     =   4800
   ScaleHeight     =   3600
   ScaleWidth      =   4800
End
Attribute VB_Name = "cSlider"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

' ======================================================================
' Class:    cSlider
' Filename: cSlider.Ctl
' Author:   SP McMahon
' Date:     14 July 1998
'
' A (very!) simple implementation of the API Slider
' control.
' ======================================================================


'
 ===============================================================================
========
' API Declares:
'
 ===============================================================================
========
Private Const WM_VSCROLL = &H115
Private Const WM_HSCROLL = &H114
Private Const WM_COMMAND = &H111
Private Const WM_COMMNOTIFY = &H44
 
Private Type tagInitCommonControlsEx
    lngSize As Long
    lngICC As Long
End Type
Const ICC_BAR_CLASSES = &H20
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal
 hWndNewParent As Long) As Long
Private Declare Function InitCommonControlsEx Lib "Comctl32.dll" _
 (iccex As tagInitCommonControlsEx) As Boolean
Private Type RECT
    left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect
 As RECT) As Long
Private Declare Function InvalidateRect Lib "user32" (ByVal hwnd As Long,
 lpRect As RECT, ByVal bErase As Long) As Long
Private Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As
 Long
'Private Const TB_ADDSTRINGA = (WM_USER + 28)
Private Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA" (ByVal
 hInstance As Long, ByVal lpBitmapName As String) As Long
'Public Const DI_MASK = 1 'VBC NR
'Public Const DI_IMAGE = 2 'VBC NR
Private Const DI_NORMAL = 3
'Public Const DI_COMPAT = 4 'VBC NR
 Const HWND_TOPMOST = -1
Const SW_HIDE = 0
Const SW_SHOWNORMAL = 1
 
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOREDRAW = &H8
Const SWP_SHOWWINDOW = &H40

Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
Private Const COLOR_BTNFACE = 15
Private Const COLOR_BTNTEXT = 18
' Window Style constants
Const WS_VISIBLE = &H10000000
Const WS_CHILD = &H40000000
Const WS_POPUP = &H80000000

' CreateWindow constants
Const CW_USEDEFAULT = &H80000000
 
Private Declare Function CreateWindowEX Lib "user32" Alias "CreateWindowExA" _
 (ByVal dwExStyle As Long, _
 ByVal lpClassName As String, ByVal lpWindowName As String, _
 ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, _
 ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, _
 ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32" _
 (ByVal hwnd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
 (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
  As Long
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
 (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As
  Long) As Long
Private Declare Function SendMessageString Lib "user32" Alias "SendMessageA" _
 (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As
  String) As Long
Private Declare Function ShowWindow Lib "user32" _
 (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Declare Function MoveWindow Lib "user32" _
 (ByVal hwnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, _
 ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" _
 (ByVal hwnd As Long) As Long
Private Const WM_PAINT = &HF
Private Const WM_USER = &H400
Private Const GWL_HWNDPARENT = (-8)
Private Const GWL_STYLE = (-16)
 Private Const WS_BORDER = &H800000
Private Const WM_DRAWITEM = &H2B
Private Const WS_CLIPCHILDREN = &H2000000
Private Const WS_CLIPSIBLINGS = &H4000000
Private Const WM_SETREDRAW = &HB
'//Common Control Constants
Private Const CCS_TOP = &H1
Private Const CCS_NOMOVEY = &H2
Private Const CCS_BOTTOM = &H3
Private Const CCS_NORESIZE = &H4
Private Const CCS_NOPARENTALIGN = &H8
'Private Const CCS_ADJUSTABLE          &H00020L
Private Const CCS_NODIVIDER = &H40
'Private Const CCS_VERT                &H00080L
'Private Const CCS_LEFT                (CCS_VERT | CCS_TOP)
'Private Const CCS_RIGHT               (CCS_VERT | CCS_BOTTOM)
'Private Const CCS_NOMOVEX             (CCS_VERT | CCS_NOMOVEY)
 
 
Private Declare Function SetWindowWord Lib "user32" (ByVal hwnd As Long, ByVal
 nIndex As Long, ByVal wNewWord As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
 (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA"
 (ByVal hwnd As Long, ByVal nIndex As Long) As Long
'Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal
 hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long,
 ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal
 hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long,
 ByVal cy As Long, ByVal wFlags As Long) As Long
 
Private Const TRACKBAR_CLASSA = "msctls_trackbar32"
 
Private Const TBS_AUTOTICKS = &H1
Private Const TBS_VERT = &H2
Private Const TBS_HORZ = &H0
Private Const TBS_TOP = &H4
Private Const TBS_BOTTOM = &H0
Private Const TBS_LEFT = &H4
Private Const TBS_RIGHT = &H0
Private Const TBS_BOTH = &H8
Private Const TBS_NOTICKS = &H10
Private Const TBS_ENABLESELRANGE = &H20
Private Const TBS_FIXEDLENGTH = &H40
Private Const TBS_NOTHUMB = &H80
Private Const TBS_TOOLTIPS = &H100
'"TB_THUMPOSITION"
Private Const TBM_GETPOS = (WM_USER)
Private Const TBM_GETRANGEMIN = (WM_USER + 1)
Private Const TBM_GETRANGEMAX = (WM_USER + 2)
Private Const TBM_GETTIC = (WM_USER + 3)
Private Const TBM_SETTIC = (WM_USER + 4)
Private Const TBM_SETPOS = (WM_USER + 5)
Private Const TBM_SETRANGE = (WM_USER + 6)
Private Const TBM_SETRANGEMIN = (WM_USER + 7)
Private Const TBM_SETRANGEMAX = (WM_USER + 8)
Private Const TBM_CLEARTICS = (WM_USER + 9)
Private Const TBM_SETSEL = (WM_USER + 10)
Private Const TBM_SETSELSTART = (WM_USER + 11)
Private Const TBM_SETSELEND = (WM_USER + 12)
Private Const TBM_GETPTICS = (WM_USER + 14)
Private Const TBM_GETTICPOS = (WM_USER + 15)
Private Const TBM_GETNUMTICS = (WM_USER + 16)
Private Const TBM_GETSELSTART = (WM_USER + 17)
Private Const TBM_GETSELEND = (WM_USER + 18)
Private Const TBM_CLEARSEL = (WM_USER + 19)
Private Const TBM_SETTICFREQ = (WM_USER + 20)
Private Const TBM_SETPAGESIZE = (WM_USER + 21)
Private Const TBM_GETPAGESIZE = (WM_USER + 22)
Private Const TBM_SETLINESIZE = (WM_USER + 23)
Private Const TBM_GETLINESIZE = (WM_USER + 24)
Private Const TBM_GETTHUMBRECT = (WM_USER + 25)
Private Const TBM_GETCHANNELRECT = (WM_USER + 26)
Private Const TBM_SETTHUMBLENGTH = (WM_USER + 27)
Private Const TBM_GETTHUMBLENGTH = (WM_USER + 28)
Private Const TBM_SETTOOLTIPS = (WM_USER + 29)
Private Const TBM_GETTOOLTIPS = (WM_USER + 30)
Private Const TBM_SETTIPSIDE = (WM_USER + 31)
'// TrackBar Tip Side flags
Private Const TBTS_TOP = 0
Private Const TBTS_LEFT = 1
Private Const TBTS_BOTTOM = 2
Private Const TBTS_RIGHT = 3

Private Const TBM_SETBUDDY = (WM_USER + 32) ' // wparam = BOOL fLeft; (or right)
Private Const TBM_GETBUDDY = (WM_USER + 33) ' // wparam = BOOL fLeft; (or right)


Private Const TB_LINEUP = 0
Private Const TB_LINEDOWN = 1
Private Const TB_PAGEUP = 2
Private Const TB_PAGEDOWN = 3
Private Const TB_THUMBPOSITION = 4
Private Const TB_THUMBTRACK = 5
Private Const TB_TOP = 6
Private Const TB_BOTTOM = 7
Private Const TB_ENDTRACK = 8


'// custom draw item specs
Private Const TBCD_TICS = &H1
Private Const TBCD_THUMB = &H2
Private Const TBCD_CHANNEL = &H3


'
 ===============================================================================
========
' Implementation
'
 ===============================================================================
========
Public Enum ESliderOrientation
    eslHorizontal = TBS_HORZ
    eslVertical = TBS_VERT
End Enum
Private m_eOrientation As ESliderOrientation
Private m_hWNd As Long
Private m_bSubClass As Boolean
Private m_lMin As Long
Private m_lMax As Long
Private m_lValue As Long

Implements ISubclass
Private m_emr As EMsgResponse

Public Event Scroll(ByVal lPos As Long)

Public Property Get Min() As Long
    Min = m_lMin
End Property
Public Property Let Min(ByVal lMin As Long)
    If (m_lMin <> lMin) Then
        m_lMin = lMin
        If (m_lMax < m_lMin) Then
            m_lMax = m_lMin + 1
        End If
        SetRange m_lMin, m_lMax
    End If
End Property

Public Property Get Max() As Long
    Max = m_lMax
End Property
Public Property Let Max(ByVal lMax As Long)
    If (m_lMax <> lMax) Then
        m_lMax = lMax
        If (m_lMin > m_lMax) Then
            m_lMin = m_lMax - 1
        End If
        SetRange m_lMin, m_lMax
    End If
End Property
Public Property Get Value() As Long
    If (m_hWNd <> 0) Then
        Value = SendMessageLong(m_hWNd, TBM_GETPOS, 0, 0)
    Else
        Value = m_lValue
    End If
End Property
Public Property Let Value(ByVal lValue As Long)
    If (m_lValue <> lValue) Then
        m_lValue = lValue
        If (m_hWNd <> 0) Then
            SendMessageLong m_hWNd, TBM_SETPOS, 1, lValue
        End If
    End If
End Property
Public Sub SetRange(ByVal lMin As Long, ByVal lMax As Long)
    SendMessageLong m_hWNd, TBM_SETRANGEMIN, True, lMin
    SendMessageLong m_hWNd, TBM_SETRANGEMAX, True, lMax
End Sub
Public Property Get Orientation() As ESliderOrientation
    Orientation = m_eOrientation
End Property
Public Property Let Orientation(ByVal eOrientation As ESliderOrientation)
    m_eOrientation = eOrientation
End Property

Private Sub pInitialise()
Dim dwStyle As Long
Dim iccex As tagInitCommonControlsEx

    With iccex
        .lngSize = LenB(iccex)
        .lngICC = ICC_BAR_CLASSES
    End With
    InitCommonControlsEx iccex

    dwStyle = WS_CHILD Or WS_VISIBLE Or TBTS_LEFT Or TBS_RIGHT
    If (m_eOrientation = eslHorizontal) Then
        dwStyle = dwStyle Or TBS_HORZ
    Else
        dwStyle = dwStyle Or TBS_VERT
    End If
    
    m_hWNd = CreateWindowEX(0, TRACKBAR_CLASSA, "", _
                dwStyle, 0, 0, 0, 0, _
                UserControl.hwnd, 0&, App.hInstance, 0&)
    If (m_hWNd <> 0) Then
        SendMessageLong m_hWNd, TBM_SETTICFREQ, 10, 0
        ' (Minimum range = low word, Maximum range = high word)
        SendMessageLong m_hWNd, TBM_SETRANGE, True, 100 * &H10000
                
        SetParent m_hWNd, UserControl.hwnd
        UserControl_Resize
        ShowWindow m_hWNd, SW_SHOWNORMAL
        
        If (UserControl.Ambient.UserMode) Then
            AttachMessage Me, UserControl.hwnd, WM_HSCROLL
            AttachMessage Me, UserControl.hwnd, WM_VSCROLL
            m_bSubClass = True
        End If
    End If
End Sub
Private Sub pTerminate()
    If (m_hWNd <> 0) Then
        ShowWindow m_hWNd, SW_HIDE
        SetParent m_hWNd, 0
        DestroyWindow m_hWNd
    End If
End Sub

Private Property Let ISubClass_MsgResponse(ByVal RHS As EMsgResponse)
    m_emr = RHS
End Property

Private Property Get ISubClass_MsgResponse() As EMsgResponse
    ISubClass_MsgResponse = emrPreprocess
End Property

Private Function ISubClass_WindowProc(ByVal hwnd As Long, ByVal iMsg As Long,
 ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lPos As Long
    lPos = Value
    RaiseEvent Scroll(lPos)
End Function

Private Sub UserControl_Initialize()
    m_lMin = 1
    m_lMax = 100
End Sub

Private Sub UserControl_InitProperties()
    pInitialise
End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    Orientation = PropBag.ReadProperty("Orientation", TBS_HORZ)
    pInitialise
    Min = PropBag.ReadProperty("Min", 1)
    Max = PropBag.ReadProperty("Max", 100)
    Value = PropBag.ReadProperty("Value", 1)
End Sub

Private Sub UserControl_Resize()
    If (m_hWNd <> 0) Then
        MoveWindow m_hWNd, 0, 0, UserControl.ScaleWidth \
         Screen.TwipsPerPixelX, UserControl.ScaleHeight \
         Screen.TwipsPerPixelY, 1
    End If
End Sub

Private Sub UserControl_Terminate()
    If (m_bSubClass) Then
        DetachMessage Me, UserControl.hwnd, WM_HSCROLL
        DetachMessage Me, UserControl.hwnd, WM_VSCROLL
    End If
    pTerminate
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
    PropBag.WriteProperty "Orientation", Orientation, eslHorizontal
    PropBag.WriteProperty "Min", Min, 1
    PropBag.WriteProperty "Max", Max, 100
    PropBag.WriteProperty "Value", Value, 1
End Sub