#include "Scroll.h" #include "Bild.h" #include "MausEreignis.h" using namespace Framework; // Inhalt der VScrollBar Klasse aus Scroll.h // Konstruktor ScrollBar::ScrollBar() : ReferenceCounter(), data( new ScrollData() ), knopfdruck( 0 ), farbe( 0xFF808080 ), bgFarbe( 0xFF000000 ), bg( 0 ), klickScroll( 10 ), mx( -1 ), my( -1 ), mp( 0 ), rend( 0 ) {} // Destruktor ScrollBar::~ScrollBar() { delete data; } // nicht constant void ScrollBar::setFarbe( int fc ) { farbe = fc; rend = 1; } void ScrollBar::setBgFarbe( int fc, bool bgF ) { bgFarbe = fc; bg = bgF; rend = 1; } void ScrollBar::update( int maxGr, int anzeigeGr ) { if( data->max != maxGr || data->anzeige != anzeigeGr ) { data->max = maxGr, data->anzeige = anzeigeGr; rend = 1; } if( data->scrollPos > data->max - data->anzeige && data->max - data->anzeige >= 0 ) { data->scrollPos = data->max - data->anzeige; rend = 1; } if( data->scrollPos < 0 ) { data->scrollPos = 0; rend = 1; } } void ScrollBar::setKlickScroll( int ks ) { klickScroll = ks; rend = 1; } void ScrollBar::scroll( int height ) { data->scrollPos = height; if( data->scrollPos > data->max - data->anzeige ) data->scrollPos = data->max - data->anzeige; if( data->scrollPos < 0 ) data->scrollPos = 0; rend = 1; } bool ScrollBar::getRend() { if( knopfdruck == 1 ) { int tmp = data->scrollPos; data->scrollPos -= klickScroll; if( data->scrollPos > data->max - data->anzeige ) data->scrollPos = data->max - data->anzeige; if( data->scrollPos < 0 ) data->scrollPos = 0; if( tmp != data->scrollPos ) rend = 1; } if( knopfdruck == 2 ) { int tmp = data->scrollPos; data->scrollPos += klickScroll; if( data->scrollPos > data->max - data->anzeige ) data->scrollPos = data->max - data->anzeige; if( data->scrollPos < 0 ) data->scrollPos = 0; if( tmp != data->scrollPos ) rend = 1; } bool ret = rend; rend = 0; return ret; } // const ScrollData *ScrollBar::getScrollData() const { return data; } int ScrollBar::getKlickScroll() const { return klickScroll; } int ScrollBar::getFarbe() const { return farbe; } int ScrollBar::getBgFarbe() const { return bg ? bgFarbe : 0; } int ScrollBar::getScroll() const { return data->scrollPos; } // Inhalt der VScrollBar Klasse VScrollBar::VScrollBar() : ScrollBar() {} // Destruktor VScrollBar::~VScrollBar() {} bool VScrollBar::doMausMessage( int x, int y, int br, int hi, MausEreignis &me ) { if( me.id == ME_Leaves ) { mp = 0; mx = -1; my = -1; } bool ret = me.mx >= x && me.mx <= x + br && me.my >= y && me.my <= y + hi; knopfdruck = 0; if( me.verarbeitet ) { mx = -1, my = -1; mp = 0; return ret; } if( me.id == ME_UScroll ) { data->scrollPos -= klickScroll; if( data->scrollPos < 0 ) data->scrollPos = 0; rend = 1; return ret; } if( me.id == ME_DScroll ) { data->scrollPos += klickScroll; if( data->scrollPos > data->max - data->anzeige ) data->scrollPos = data->max - data->anzeige; if( data->scrollPos < 0 ) data->scrollPos = 0; rend = 1; return ret; } if( ret ) mx = me.mx - x, my = me.my - y; else mx = -1, my = -1; if( me.id == ME_PLinks ) mp = 1; if( me.id == ME_RLinks ) mp = 0; if( mp ) { if( mx >= 0 && my >= 0 ) { if( my < br ) { knopfdruck = 1; data->scrollPos -= klickScroll; } else if( my > hi - br ) { knopfdruck = 2; data->scrollPos += klickScroll; } else data->scrollPos = (int)( ( data->max / ( hi - 2.0 * br ) ) * ( my - br ) ) - data->anzeige / 2; if( data->scrollPos > data->max - data->anzeige ) data->scrollPos = data->max - data->anzeige; if( data->scrollPos < 0 ) data->scrollPos = 0; rend = 1; } } return ret; } void VScrollBar::render( int x, int y, int br, int hi, Bild &zRObj ) const { if( bg ) zRObj.alphaRegion( x, y, br, hi, bgFarbe ); --br; --hi; zRObj.drawLinieH( x, y, br + 1, farbe ); zRObj.drawLinieH( x, y + hi, br + 1, farbe ); zRObj.drawLinieV( x, y + 1, hi - 1, farbe ); zRObj.drawLinieV( x + br, y + 1, hi - 1, farbe ); zRObj.drawLinieH( x + 1, y + br, br - 1, farbe ); zRObj.drawLinieH( x + 1, y + hi - br, br - 1, farbe ); ++br; ++hi; int st = (int)( data->scrollPos / ( data->max / ( hi - br * 2.0 ) ) ); int end = (int)( ( hi - 2.0 * br ) / ( (double)data->max / data->anzeige ) ); if( data->scrollPos > data->max - data->anzeige ) data->scrollPos = data->max - data->anzeige; if( data->scrollPos < 0 ) { data->scrollPos = 0; end = hi - br * 2; } zRObj.fillRegion( x + 1, y + br + st, br - 1, end, farbe ); } // Inhalt der HScrollBar Klasse aus Scroll.h // Konstruktor HScrollBar::HScrollBar() : ScrollBar() {} // Destruktor HScrollBar::~HScrollBar() {} // nicht constant bool HScrollBar::doMausMessage( int x, int y, int br, int hi, MausEreignis &me ) { if( me.id == ME_Leaves ) { mp = 0; mx = -1; my = -1; } bool ret = me.mx >= x && me.mx <= x + br && me.my >= y && me.my <= y + hi; knopfdruck = 0; if( me.verarbeitet ) { mx = -1, my = -1; mp = 0; return ret; } if( me.id == ME_LScroll ) { data->scrollPos -= klickScroll; if( data->scrollPos < 0 ) data->scrollPos = 0; rend = 1; return ret; } if( me.id == ME_RScroll ) { data->scrollPos += klickScroll; if( data->scrollPos > data->max - data->anzeige ) data->scrollPos = data->max - data->anzeige; if( data->scrollPos < 0 ) data->scrollPos = 0; rend = 1; return ret; } if( ret ) mx = me.mx - x, my = me.my - y; else mx = -1, my = -1; if( me.id == ME_PLinks ) mp = 1; if( me.id == ME_RLinks ) mp = 0; if( mp ) { if( mx >= 0 && my >= 0 ) { if( mx < hi ) { knopfdruck = 1; data->scrollPos -= klickScroll; } else if( mx > br - hi ) { knopfdruck = 2; data->scrollPos += klickScroll; } else data->scrollPos = (int)( ( data->max / ( br - 2.0 * hi ) ) * ( mx - hi ) ) - data->anzeige / 2; if( data->scrollPos > data->max - data->anzeige ) data->scrollPos = data->max - data->anzeige; if( data->scrollPos < 0 ) data->scrollPos = 0; rend = 1; } } return ret; } void HScrollBar::render( int x, int y, int br, int hi, Bild &zRObj ) const { if( bg ) zRObj.alphaRegion( x, y, br, hi, bgFarbe ); --br; --hi; zRObj.drawLinieV( x, y, hi + 1, farbe ); zRObj.drawLinieV( x + br, y, hi + 1, farbe ); zRObj.drawLinieH( x + 1, y, br - 1, farbe ); zRObj.drawLinieH( x + 1, y + hi, br - 1, farbe ); zRObj.drawLinieV( x + hi, y + 1, hi - 1, farbe ); zRObj.drawLinieV( x + br - hi, y + 1, hi - 1, farbe ); ++br; ++hi; int st = (int)( data->scrollPos / ( data->max / ( br - hi * 2.0 ) ) ); int end = (int)( ( br - 2.0 * hi ) / ( (double)data->max / data->anzeige ) ); if( data->scrollPos > data->max - data->anzeige ) data->scrollPos = data->max - data->anzeige; if( data->scrollPos < 0 ) { data->scrollPos = 0; end = br - hi * 2; } zRObj.fillRegion( x + hi + st, y + 1, end, hi - 1, farbe ); }