⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scrollarea.cpp

📁 Linux系统下的《红色警戒》游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*      _______   __   __   __   ______   __   __   _______   __   __                  *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\                 *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /                  *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /                   *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /                    * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /                     * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/                       * * Copyright (c) 2004, 2005 darkbits                        Js_./ * Per Larsson a.k.a finalman                          _RqZ{a<^_aa * Olof Naess閚 a.k.a jansem/yakslem                _asww7!uY`>  )\a// *                                                 _Qhm`] _f "'c  1!5m * Visit: http://guichan.darkbits.org             )Qk<P ` _: :+' .'  "{[ *                                               .)j(] .d_/ '-(  P .   S * License: (BSD)                                <Td/Z <fP"5(\"??"\a.  .L * Redistribution and use in source and          _dV>ws?a-?'      ._/L  #' * binary forms, with or without                 )4d[#7r, .   '     )d`)[ * modification, are permitted provided         _Q-5'5W..j/?'   -?!\)cam' * that the following conditions are met:       j<<WP+k/);.        _W=j f * 1. Redistributions of source code must       .$%w\/]Q  . ."'  .  mj$ *    retain the above copyright notice,        ]E.pYY(Q]>.   a     J@\ *    this list of conditions and the           j(]1u<sE"L,. .   ./^ ]{a *    following disclaimer.                     4'_uomm\.  )L);-4     (3= * 2. Redistributions in binary form must        )_]X{Z('a_"a7'<a"a,  ]"[ *    reproduce the above copyright notice,       #}<]m7`Za??4,P-"'7. ).m *    this list of conditions and the            ]d2e)Q(<Q(  ?94   b-  LQ/ *    following disclaimer in the                <B!</]C)d_, '(<' .f. =C+m *    documentation and/or other materials      .Z!=J ]e []('-4f _ ) -.)m]' *    provided with the distribution.          .w[5]' _[ /.)_-"+?   _/ <W" * 3. Neither the name of Guichan nor the      :$we` _! + _/ .        j? *    names of its contributors may be used     =3)= _f  (_yQmWW$#(    " *    to endorse or promote products derived     -   W,  sQQQQmZQ#Wwa].. *    from this software without specific        (js, \[QQW$QWW#?!V"". *    prior written permission.                    ]y:.<\..          . *                                                 -]n w/ '         [. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT       )/ )/           ! * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY         <  (; sac    ,    ' * EXPRESS OR IMPLIED WARRANTIES, INCLUDING,               ]^ .-  % * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF            c <   r * MERCHANTABILITY AND FITNESS FOR A PARTICULAR            aga<  <La * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE          5%  )P'-3L * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR        _bQf` y`..)a * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,          ,J?4P'.P"_(\?d'., * EXEMPLARY, OR CONSEQUENTIAL DAMAGES               _Pa,)!f/<[]/  ?" * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT      _2-..:. .r+_,.. . * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     ?a.<%"'  " -'.a_ _, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION)                     ^ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *//* * For comments regarding functions please see the header file.  */#include "guichan/exception.h"#include "guichan/widgets/scrollarea.h"namespace gcn{    ScrollArea::ScrollArea()    {        mVScroll = 0;        mHScroll = 0;        mHPolicy = SHOW_AUTO;        mVPolicy = SHOW_AUTO;        mScrollbarWidth = 12;        mContent = NULL;        mUpButtonPressed = false;        mDownButtonPressed = false;        mLeftButtonPressed = false;        mRightButtonPressed = false;        mVerticalMarkerPressed = false;        mVerticalMarkerMousePosition = 0;        mHorizontalMarkerPressed = false;        mHorizontalMarkerMousePosition = 0;        addMouseListener(this);    }    ScrollArea::ScrollArea(Widget *content)    {        mVScroll = 0;        mHScroll = 0;        mHPolicy = SHOW_AUTO;        mVPolicy = SHOW_AUTO;        mScrollbarWidth = 12;        mContent = NULL;        mUpButtonPressed = false;        mDownButtonPressed = false;        mLeftButtonPressed = false;        mRightButtonPressed = false;        mVerticalMarkerPressed = false;        mVerticalMarkerMousePosition = 0;        mHorizontalMarkerPressed = false;        mHorizontalMarkerMousePosition = 0;        setContent(content);        addMouseListener(this);    }    ScrollArea::ScrollArea(Widget *content, unsigned int hPolicy, unsigned int vPolicy)    {        mVScroll = 0;        mHScroll = 0;        mHPolicy = hPolicy;        mVPolicy = vPolicy;        mScrollbarWidth = 12;        mContent = NULL;        mUpButtonPressed = false;        mDownButtonPressed = false;        mLeftButtonPressed = false;        mRightButtonPressed = false;        mVerticalMarkerPressed = false;        mVerticalMarkerMousePosition = 0;        mHorizontalMarkerPressed = false;        mHorizontalMarkerMousePosition = 0;        setContent(content);        addMouseListener(this);     }    ScrollArea::~ScrollArea()    {        setContent(NULL);            }        void ScrollArea::setContent(Widget* widget)    {        if (mContent != NULL)        {            mContent->_setFocusHandler(NULL);            mContent->_setParent(NULL);        }            mContent = widget;        if (mContent != NULL)        {            mContent->_setFocusHandler(_getFocusHandler());            mContent->_setParent(this);        }        checkPolicies();    }      Widget* ScrollArea::getContent()    {        return mContent;    }    void ScrollArea::setHorizontalScrollPolicy(unsigned int hPolicy)    {        mHPolicy = hPolicy;        checkPolicies();    }    unsigned int ScrollArea::getHorizontalScrollPolicy()    {        return mHPolicy;    }    void ScrollArea::setVerticalScrollPolicy(unsigned int vPolicy)    {        mVPolicy = vPolicy;        checkPolicies();    }    unsigned int ScrollArea::getVerticalScrollPolicy()    {        return mVPolicy;    }    void ScrollArea::setScrollPolicy(unsigned int hPolicy, unsigned int vPolicy)    {        mHPolicy = hPolicy;        mVPolicy = vPolicy;        checkPolicies();    }    void ScrollArea::setVerticalScrollAmount(int vScroll)    {        int max = getVerticalMaxScroll();        mVScroll = vScroll;            if (vScroll > max)        {            mVScroll = max;        }            if (vScroll < 0)        {            mVScroll = 0;        }    }    int ScrollArea::getVerticalScrollAmount()    {        return mVScroll;    }    void ScrollArea::setHorizontalScrollAmount(int hScroll)    {        int max = getHorizontalMaxScroll();            mHScroll = hScroll;            if (hScroll > max)        {            mHScroll = max;        }        else if (hScroll < 0)        {            mHScroll = 0;        }    }    int ScrollArea::getHorizontalScrollAmount()    {        return mHScroll;    }    void ScrollArea::setScrollAmount(int hScroll, int vScroll)    {        setHorizontalScrollAmount(hScroll);        setVerticalScrollAmount(vScroll);    }    int ScrollArea::getHorizontalMaxScroll()    {        checkPolicies();        if (mContent == NULL)        {            return 0;        }                int value = mContent->getWidth() - getContentDimension().width + 2 * mContent->getBorderSize();        if (value < 0)        {            return 0;        }        return value;    }     int ScrollArea::getVerticalMaxScroll()    {        checkPolicies();        if (mContent == NULL)        {            return 0;        }        int value;            value = mContent->getHeight() - getContentDimension().height + 2 * mContent->getBorderSize();            if (value < 0)        {            return 0;        }        return value;    }     void ScrollArea::setScrollbarWidth(int width)    {        if (width > 0)        {            mScrollbarWidth = width;        }        else        {            throw GCN_EXCEPTION("Width should be greater then 0.");        }    }    int ScrollArea::getScrollbarWidth()    {        return mScrollbarWidth;    }    void ScrollArea::_setFocusHandler(FocusHandler* focusHandler)    {        BasicContainer::_setFocusHandler(focusHandler);        if (mContent)        {            mContent->_setFocusHandler(focusHandler);        }    }    void ScrollArea::_mouseInputMessage(const MouseInput &mouseInput)    {        BasicContainer::_mouseInputMessage(mouseInput);                    if (getContentDimension().isPointInRect(mouseInput.x, mouseInput.y))        {            if (mContent != NULL)            {                if (!mContent->hasMouse())                {                    mContent->_mouseInMessage();                          }                        MouseInput mi = mouseInput;                                mi.x -= mContent->getX();                mi.y -= mContent->getY();                                                mContent->_mouseInputMessage(mi);            }              }        else if (mContent && mContent->hasMouse())        {            mContent->_mouseOutMessage();        }    }    void ScrollArea::_mouseOutMessage()    {        if (mContent && mContent->hasMouse())        {            mContent->_mouseOutMessage();        }            BasicContainer::_mouseOutMessage();    }      void ScrollArea::mousePress(int x, int y, int button)    {        if (getUpButtonDimension().isPointInRect(x, y))        {            setVerticalScrollAmount(getVerticalScrollAmount() - 10);            mUpButtonPressed = true;        }        else if (getDownButtonDimension().isPointInRect(x, y))        {            setVerticalScrollAmount(getVerticalScrollAmount() + 10);            mDownButtonPressed = true;        }        else if (getLeftButtonDimension().isPointInRect(x, y))        {            setHorizontalScrollAmount(getHorizontalScrollAmount() - 10);            mLeftButtonPressed = true;        }        else if (getRightButtonDimension().isPointInRect(x, y))        {            setHorizontalScrollAmount(getHorizontalScrollAmount() + 10);            mRightButtonPressed = true;        }                else if (getVerticalMarkerDimension().isPointInRect(x, y))        {            mVerticalMarkerPressed = true;            mVerticalMarkerMousePosition = y - getVerticalMarkerDimension().y;        }        else if (getHorizontalMarkerDimension().isPointInRect(x, y))        {            mHorizontalMarkerPressed = true;            mHorizontalMarkerMousePosition = x - getHorizontalMarkerDimension().x;        }     }    void ScrollArea::mouseRelease(int x, int y, int button)    {        mUpButtonPressed = false;        mDownButtonPressed = false;        mLeftButtonPressed = false;        mRightButtonPressed = false;        mVerticalMarkerPressed = false;        mHorizontalMarkerPressed = false;    }    void ScrollArea::mouseMotion(int x, int y)    {        if (mVerticalMarkerPressed)        {            int pos = y - getVerticalBarDimension().y  - mVerticalMarkerMousePosition;            int length = getVerticalMarkerDimension().height;            Rectangle barDim = getVerticalBarDimension();                  if ((barDim.height - length) > 0)            {                setVerticalScrollAmount((getVerticalMaxScroll() * pos)                                        / (barDim.height - length));            }            else            {                setVerticalScrollAmount(0);            }             }        if (mHorizontalMarkerPressed)        {            int pos = x - getHorizontalBarDimension().x  - mHorizontalMarkerMousePosition;            int length = getHorizontalMarkerDimension().width;            Rectangle barDim = getHorizontalBarDimension();                  if ((barDim.width - length) > 0)            {                setHorizontalScrollAmount((getHorizontalMaxScroll() * pos)                                          / (barDim.width - length));            }            else            {                setHorizontalScrollAmount(0);            }             }    }    void ScrollArea::draw(Graphics *graphics)    {        graphics->setColor(getBackgroundColor());        graphics->fillRectangle(getContentDimension());              int alpha = getBaseColor().a;        Color highlightColor = getBaseColor() + 0x303030;        highlightColor.a = alpha;            Color shadowColor = getBaseColor() - 0x303030;              shadowColor.a = alpha;              if (mVBarVisible)        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -