📄 scroll.cpp
字号:
#include "GKL.h"
using namespace GKL;
const int ARROW_HEIGHT = 25;
Scroll::Scroll(Window *pWnd, int x, int y, int width, int maxValue, void (*onScroll)(Scroll*)):
Control(pWnd),
COLOR_OUT(0xCF), COLOR_OVER(0xEF), COLOR_BORDER(0xAF),
mX(x), mY(y),
mWidth(width), mHeight(ARROW_HEIGHT),
mMaxValue(maxValue), mValue(0),
mOnScroll(onScroll),
mColor1(COLOR_OUT), mDestColor1(COLOR_OUT),
mColor2(COLOR_OUT), mDestColor2(COLOR_OUT),
mValueChanged(false)
{
alert(maxValue < 0);
if(mWidth < 2*ARROW_HEIGHT)
mWidth = 2*ARROW_HEIGHT;
}
Scroll::~Scroll(void)
{
}
int Scroll::setValue(int value)
{
if(value < 0)
return -1;
if(value > mMaxValue)
return -1;
mValue = value;
mValueChanged = true;
return 0;
}
int Scroll::getValue(void)
{
return mValue;
}
int Scroll::onDrawDetect(int &flagDraw)
{
if(mValueChanged)
{
mValueChanged = false;
if(flagDraw == DRAW_NONE)
flagDraw = DRAW_NORMAL;
}
if(mColor1 != mDestColor1)
{
if(mDestColor1 > mColor1)
mColor1 += 2;
else
mColor1 -= 2;
if(flagDraw == DRAW_NONE)
flagDraw = DRAW_NORMAL;
}
if(mColor2 != mDestColor2)
{
if(mDestColor2 > mColor2)
mColor2 += 2;
else
mColor2 -= 2;
if(flagDraw == DRAW_NONE)
flagDraw = DRAW_NORMAL;
}
return 0;
}
void Scroll::reDraw(void)
{
HPEN hPen, hPenOld;
HBRUSH hBr, hBrOld;
hPen = CreatePen(PS_SOLID, 1, RGB(COLOR_BORDER, COLOR_BORDER, COLOR_BORDER));
hPenOld = (HPEN)SelectObject(mpPnl->gethMemDC(), hPen);
RECT rect = {mX + 1 + mHeight/2, mY, mX + mWidth - 1 - mHeight/2, mY + mHeight};
hBr = CreateSolidBrush(RGB(COLOR_OVER, COLOR_OVER, COLOR_OVER));
FillRect(mpPnl->gethMemDC(), &rect, hBr);
DeleteObject(hBr);
POINT arrow1[3] =
{
{mX, mY + mHeight/2},
{mX + mHeight/2, mY},
{mX + mHeight/2, mY + mHeight - 1}
};
POINT arrow2[3] =
{
{mX + mWidth - 1, mY + mHeight/2},
{mX + mWidth - mHeight/2 - 1, mY},
{mX + mWidth - mHeight/2 - 1, mY + mHeight - 1}
};
hBr = CreateSolidBrush(RGB(mColor1, mColor1, mColor1));
hBrOld = (HBRUSH)SelectObject(mpPnl->gethMemDC(), hBr);
Polygon(mpPnl->gethMemDC(), arrow1, 3);
SelectObject(mpPnl->gethMemDC(), hBrOld);
DeleteObject(hBr);
hBr = CreateSolidBrush(RGB(mColor2, mColor2, mColor2));
hBrOld = (HBRUSH)SelectObject(mpPnl->gethMemDC(), hBr);
Polygon(mpPnl->gethMemDC(), arrow2, 3);
SelectObject(mpPnl->gethMemDC(), hBrOld);
DeleteObject(hBr);
rect.left = mX + mHeight/2 + 1 + (mWidth - (mHeight/2)*3 - 2)*mValue/mMaxValue;
rect.right = rect.left + mHeight/2;
hBr = CreateSolidBrush(RGB(COLOR_OUT, COLOR_OUT, COLOR_OUT));
hBrOld = (HBRUSH)SelectObject(mpPnl->gethMemDC(), hBr);
Rectangle(mpPnl->gethMemDC(), rect.left, rect.top, rect.right, rect.bottom);
SelectObject(mpPnl->gethMemDC(), hBrOld);
DeleteObject(hBr);
SelectObject(mpPnl->gethMemDC(), hPenOld);
DeleteObject(hPen);
}
int Scroll::onKBEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
{
return 0;
}
int Scroll::onMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
{
int x = LOWORD(lParam);
int y = HIWORD(lParam);
if(mpPnl != NULL)
mpPnl->WindowToPanel(x, y);
bool inArea1 =
(x + y > mX + mY + mHeight/2) &&
(x - y > mX - mY - mHeight/2) &&
(x < mX + mHeight/2);
bool inArea2 =
(x + y < mX + mWidth - 1 + mY + mHeight/2) &&
(x - y < mX + mWidth - 1 - mY - mHeight/2) &&
(x > mX + mWidth - mHeight/2 - 1);
bool inAreaMain = (x >= mX + mHeight/2 + 1) && (x <= mX + mWidth - 2 - mHeight/2) &&
(y >= mY) && (y <= mY + mHeight - 1);
switch(uMsg)
{
case WM_LBUTTONDOWN:
if(inArea1)
{
mValue = mValue>0 ? mValue-1 : 0;
mValueChanged = true;
mOnScroll(this);
}
if(inArea2)
{
mValue = mValue<mMaxValue ? mValue+1 : mMaxValue;
mValueChanged = true;
mOnScroll(this);
}
if(inAreaMain)
{
mValue = mMaxValue*(x - (mX + mHeight/2 + 1) - mHeight/4)/(mWidth - (mHeight/2)*3 - 2);
if(mValue < 0)
mValue = 0;
else if(mValue > mMaxValue)
mValue = mMaxValue;
mValueChanged = true;
mOnScroll(this);
}
break;
case WM_MOUSEMOVE:
if(inArea1)
mDestColor1 = COLOR_OVER;
else
mDestColor1 = COLOR_OUT;
if(inArea2)
mDestColor2 = COLOR_OVER;
else
mDestColor2 = COLOR_OUT;
break;
}
if(inArea1 || inArea2 || inAreaMain)
return -1;
else
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -