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

📄 scroll.cpp

📁 C语言大赛的平台。分为环境模块和策略模块。
💻 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 + -