/*
	TrackBar
	
	All the useful information for a trackbar.
*/

typedef struct {
        HWND    hwnd;           // our window handle
        HDC     hdc;            // current DC

        LONG    lLogMin;        // Logical minimum
        LONG    lLogMax;        // Logical maximum
        LONG    lLogPos;        // Logical position

        LONG    lSelStart;      // Logical selection start
        LONG    lSelEnd;        // Logical selection end

        WORD    wThumbWidth;    // Width of the thumb
        WORD    wThumbHeight;   // Height of the thumb

        int     iSizePhys;      // Size of where thumb lives
        RECT    rc;             // track bar rect.

        RECT    Thumb;          // Rectangle we current thumb
        DWORD   dwDragPos;      // Logical position of mouse while dragging.

        WORD    Flags;          // Flags for our window
        int     Timer;          // Our timer.
        WORD    Cmd;            // The command we're repeating.

        int     nTics;          // number of ticks.
        PDWORD  pTics;          // the tick marks.

} TrackBar, *PTrackBar;

// Trackbar flags

#define TBF_NOTHUMB     0x0001  // No thumb because not wide enough.
#define TBF_SELECTION   0x0002  // a selection has been established (draw the range)

/*
	useful constants.
*/

#define REPEATTIME      500     // mouse auto repeat 1/2 of a second
#define TIMER_ID        1

#define	GWW_TRACKMEM		0 /* handle to track bar memory */
#define EXTRA_TB_BYTES          sizeof(PTrackBar) /* Total extra bytes.         */

/*
	Useful defines.
*/

#define TrackBarCreate(hwnd)    SetWindowWord(hwnd,GWW_TRACKMEM,(WORD)LocalAlloc(LPTR,sizeof(TrackBar)))
#define TrackBarDestroy(hwnd)   LocalFree((HLOCAL)GetWindowWord(hwnd,GWW_TRACKMEM))
#define TrackBarLock(hwnd)      (PTrackBar)GetWindowWord(hwnd,GWW_TRACKMEM)

/*
	Function Prototypes
*/

static void   NEAR PASCAL DoTrack(PTrackBar, int, DWORD);
static WORD   NEAR PASCAL WTrackType(PTrackBar, LONG);
static void   NEAR PASCAL TBTrackInit(PTrackBar, LONG);
static void   NEAR PASCAL TBTrackEnd(PTrackBar, LONG);
static void   NEAR PASCAL TBTrack(PTrackBar, LONG);
static void   NEAR PASCAL DrawThumb(PTrackBar);
static HBRUSH NEAR PASCAL SelectColorObjects(PTrackBar, BOOL);
static void   NEAR PASCAL SetTBCaretPos(PTrackBar);

extern DWORD FAR PASCAL lMulDiv32(DWORD, DWORD, DWORD);