SOL9 2.0 Class: ScrollBar

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * ScrollBar.h 
 * Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


// SOL++2000
// 2000.02.18
#pragma once

#include <sol\Primitive.h>

namespace SOL {

#define Max(a,b)    (((a) > (b)) ? (a) : (b))
#define Min(a,b)    (((a) < (b)) ? (a) : (b))


class ScrollBar    :public Primitive {
private:
    int        pageIncrement;
    int        lineIncrement;

public:
    static const int ScrollBar::HORIZONTAL = (int)SB_HORZ;
    static const int ScrollBar::VERTICAL   = (int)SB_VERT;

protected:
    LRESULT ScrollBar::defaultProc(Event& event)
    {
        return discardInput(event);
    }

public:
    ScrollBar():Primitive() { }
      

public:
    ScrollBar(View* parent, const TCHAR* name, Args& args)
    :Primitive(parent, name, 
            args.set(XmNpredefined, TRUE)
                .set(XmNclassName, _T("ScrollBar")))
    {
        pageIncrement = 4;
        lineIncrement = 1;
        setValues(args);
    }

public:
    virtual Boolean create(View* parent, const TCHAR* name, Args& args)
    {
        Boolean rc = Primitive::create(parent, name, 
            args.set(XmNpredefined, TRUE)
                .set(XmNclassName, _T("ScrollBar")));

        pageIncrement = 4;
        lineIncrement = 1;
        setValues(args);

        return rc;
    }


public:
    int moveThumb(Event& event)
    {
        int pos  = getPos();
        int prev = pos;

        SCROLLINFO scInfo;
        int min, max;
        getScrollRange(&min, &max);
        int range = max - min;

        int request = LOWORD(event.getWParam());
        switch(request) {

        case SB_PAGEDOWN: pos += pageIncrement;
        case SB_LINEDOWN: pos = Min(range, pos + lineIncrement);
            break;

        case SB_PAGEUP:  pos -= pageIncrement;
        case SB_LINEUP:  pos = Max(0, pos - lineIncrement);
            break;

        case SB_TOP: pos = 0;
            break;

        case SB_BOTTOM:    pos = range;
            break;

        case SB_THUMBPOSITION:
        case SB_THUMBTRACK:
            scInfo.fMask = SIF_ALL;
            getScrollInfo(&scInfo);
            pos = scInfo.nTrackPos;
            break;

        default:
            break;
        }
        setPos(pos);
        return  prev - pos;
    }

public:
    void ScrollBar::getValues(Args& args)
    {
        Primitive::getValues(args);

        int num   = args.getCount();
        Arg* arg  = args.getArgList();
        int max, min;

        for (int i = 0; i<num; i++) {
            const TCHAR*  name = arg[i].name;
            ulong* val  = (ulong*)arg[i].value;
            if (name == XmNpageIncrement) {
                *val =  pageIncrement;    // 08/02 '94
                continue;
            }
            if (name == XmNlineIncrement) {
                *val =  lineIncrement;
                continue;
            }
            if (name == XmNmaximum) {
                getScrollRange(&min, &max);
                *val = max;
                continue;
            }
            if (name == XmNminimum) {
                getScrollRange(&min, &max);
                *val = min;
                continue;
            }
            if (name == XmNthumbPosition) {
                *val = (ulong)getPos();
                continue;
            }
        }
    }

public:
    void setValues(Args& args)
    {
        Primitive::setValues(args);

        ulong val;
        if (args.get(XmNpageIncrement, &val))
            pageIncrement = (int)val;
        if (args.get(XmNlineIncrement, &val))
            lineIncrement = (int)val;

        int max, min;
        getScrollRange(&min, &max);
        if (args.get(XmNmaximum, &val))
            setScrollRange(min, (int)val);

        getScrollRange(&min, &max);
        if (args.get(XmNminimum, &val))
            setScrollRange((int)val, max);

        if (args.get(XmNthumbPosition, &val))
            setPos((int)val);
    }


public:
    void disable()
    {
        if(isEditable()) {
            if(!getNewProc()) 
                replaceWindowProc();
        }
        else {
               View::disable();
        }
    }

public:
    void enable()
    {
        if(isEditable()) {
            restoreWindowProc();
        }
        else {
            View::enable();
        }
    }

public:
    BOOL getScrollInfo(SCROLLINFO* scInfo) 
    {
        BOOL rc = FALSE;
        if(scInfo) {
            scInfo->cbSize = sizeof(SCROLLINFO);
            rc  = ::GetScrollInfo(getWindow(), SB_CTL, scInfo);
        }
        return rc;
    }
    
public:
    int    setScrollInfo(SCROLLINFO* scInfo) 
    {
        int pos = 0;
        if(scInfo) {
            scInfo->cbSize = sizeof(SCROLLINFO);
            pos = ::SetScrollInfo(getWindow(), SB_CTL, scInfo, TRUE);
        }
        return pos;
    }

    int        getPos() {
            return ::GetScrollPos(getWindow(), SB_CTL);
    }

    void    getScrollRange(int* min, int* max) {
             ::GetScrollRange(getWindow(), SB_CTL, min, max);
    }

    void     setPos(int pos) {
            ::SetScrollPos(getWindow(), SB_CTL, pos, TRUE);
    }

    int        getPageIncrement() { return pageIncrement; }

    int        getLineIncrement() { return lineIncrement; }

    void    setScrollRange(int min, int max) {
             ::SetScrollRange(getWindow(), SB_CTL, min, max, TRUE);
    }

    void    setPageIncrement(int val) { pageIncrement = val; }

    void    setLineIncrement(int val) { lineIncrement = val; }


    void    enableArrows(int arrows) {
            send(SBM_ENABLE_ARROWS, (WPARAM)arrows, 0L);
    }

    void    getRange(int* min, int* max) {
             send(SBM_GETRANGE, (WPARAM)min, (LPARAM)max);
    }

    void    setRange(int min, int max) {
             send(SBM_SETRANGE, (WPARAM)min, (LPARAM)max);
    }

    void    setRangeRedraw(int min, int max) {
             send(SBM_SETRANGEREDRAW, (WPARAM)min, (LPARAM)max);
    }
};

}


Last modified: 1 Feb 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.