///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//  KNOB.H
//
//	Defines the Knob Control
//
//	Copyright (c) Microsoft Corporation	1997
//    
//	12/18/97 David Stewart / dstewart
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef _KNOB_HEADER_
#define _KNOB_HEADER_

#include "windows.h"

#ifdef __cplusplus
extern "C" {
#endif

//forward declaration
class CKnob;

//helper functions for global stuff, start up, shut down, etc.
CKnob* GetKnobFromID(HWND hwndParent, int nID);
CKnob* GetKnobFromHWND(HWND hwnd);

class CKnob
{
    public:
        /*
        Create a class of the knob
        */
        friend CKnob* CreateKnob(DWORD dwWindowStyle,
                                 DWORD dwRange,
                                 DWORD dwInitialPosition,
                                 int x,
                                 int y,
                                 int width,
                                 int height,
                                 HWND hwndParent,
                                 int nID,
                                 HINSTANCE hInst);

        CKnob(); //constructor
        ~CKnob(); //destructor

        HWND GetHWND() {return m_hwnd;}
        int GetID() {return m_nID;}
        void SetRange(DWORD dwRange) {m_dwRange = dwRange;}
        DWORD GetRange() {return m_dwRange;}
        DWORD GetPosition() {return m_dwCurPosition;}

        void SetPosition(DWORD dwPosition, BOOL fNotify);

    private:
        //non-static privates
        int m_nID;
        HWND m_hwnd;
        int m_nLightX;
        int m_nLightY;
        DWORD m_dwRange;
        DWORD m_dwPosition;
        DWORD m_dwCurPosition;
        double m_trackdegree;
        UINT_PTR m_uFlashTimerID;
        UINT_PTR m_uTrackTimerID;
        BOOL m_fDim;
        BOOL m_fFastKnob;

        void OnButtonDown(int x, int y);
        void OnButtonUp();
        BOOL ComputeCursor(int deltaX, int deltaY, int maxdist);
        void OnMouseMove(int x, int y);
        void OnTimer();
        void OnFlashTimer();
        void Draw(HDC hdc);
        void KMaskBlt(HDC hdcDest, int x, int y, int width, int height, HDC hdcSource, int xs, int ys, HBITMAP hMask, int xm, int xy, DWORD dwDummy);

    private:
        //static stuff for all knobs
        static HINSTANCE m_hInst;
        static DWORD m_dwKnobClassRef;
        static ATOM m_KnobAtom;
        static HANDLE m_hbmpKnob;
        static HANDLE m_hbmpKnobTab;
        static HANDLE m_hbmpLight;
        static HANDLE m_hbmpLightBright;
        static HANDLE m_hbmpLightMask;
        static int m_nLightWidth;
        static int m_nLightHeight;

        static LRESULT CALLBACK KnobProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
        static void CALLBACK TrackProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime);
        static void CALLBACK FlashProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime);
        static BOOL InitKnobs(HINSTANCE hInst);
        static void UninitKnobs();
};

#ifdef __cplusplus
};
#endif

#endif  //_KNOB_HEADER_