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

📄 scroll.cpp

📁 XOSL 多操作系统管理工具 源代码 多系统引导工具
💻 CPP
字号:
/*
 * Extended Operating System Loader (XOSL)
 * Copyright (c) 1999 by Geurt Vos
 *
 * This code is distributed under GNU General Public License (GPL)
 *
 * The full text of the license can be found in the GPL.TXT file,
 * or at http://www.gnu.org
 */

#include <scroll.h>
#include <graph.h>
#include <key.h>

#define SCROLLBAR_WIDTH 18

#define BUTTON_UP     0
#define BUTTON_DOWN   1
#define BUTTON_SCROLL 2

void printf(const char *,...);

CScrollBar::CScrollBar(int Min, int Max, int Value, int Ctl3D, int Left, int Top, int Height, int Visible, void *HandlerClass):
	CAnimatedControl(Left,Top,SCROLLBAR_WIDTH,Height,Visible,false,HandlerClass)
{
	this->Min = Min;
	this->Max = Max;
	this->Value = Value;
	this->Ctl3D = Ctl3D;
	ScrollChange = NULL;
	TopButtonClick = false;
	BottomButtonClick = false;
	ScrollButtonClick = false;
	MouseAction = false;
	Owner = NULL;
}

CScrollBar::~CScrollBar()
{
}

void CScrollBar::SetOwner(CControl *Owner)
{
	this->Owner = Owner;
}

void CScrollBar::SetCtl3D(int Ctl3D)
{
	this->Ctl3D = Ctl3D;
	Refresh();
}

void CScrollBar::SetMin(int Min)
{
	this->Min = Min;
	Refresh();
}

void CScrollBar::SetMax(int Max)
{
	this->Max = Max;
	Refresh();
}

void CScrollBar::SetValue(int Value)
{
	if (Value < Min)
		Value = Min;
	else
		if (Value > Max)
			Value = Max;
	if (Value != this->Value) {
		this->Value = Value;
		Refresh();
		if (ScrollChange && HandlerClass)
			ScrollChange(HandlerClass,Value);
	}
}

void CScrollBar::Focus()
{
	if (!MouseAction && Parent && HandlerClass) {
		if (Parent->GetLastFocus() == HandlerClass) {
			Parent->FocusNext();
		}
		else {
			Parent->FocusPrev();
		}
	}
	else {
		if (Owner) {
			Owner->Focus();
		}
		GotFocus = true;
	}
}

void CScrollBar::Blur()
{
	GotFocus = false;
}


int CScrollBar::GetValue()
{
	return Value;
}

void CScrollBar::OnChange(TScrollChange ScrollChange)
{
	this->ScrollChange = ScrollChange;
}

int CScrollBar::MouseDown(int MouseX, int MouseY)
{
	int Status;

	MouseAction = true;
	Status = CControl::MouseDown(MouseX, MouseY);
	if (Status != -1) {
		if (MouseX > Left && MouseX < Right)
			if (MouseY > Top && MouseY < Top + 17) {
				TopButtonClick = true;
				SetValue(Value - 1);
			}
			else
				if (MouseY < Bottom && MouseY > Bottom - 17) {
					BottomButtonClick = true;
					SetValue(Value + 1);
				}
				else {
					ScrollButtonClick = true;
					MouseMove(MouseX,MouseY);
				}
	}
	else {
		MouseAction = false;
	}
	return Status;
}

int CScrollBar::MouseMove(int X, int Y)
{
	int ValueM2;
	int Value;
	int Status;

	Status = CAnimatedControl::MouseMove(X,Y);
//	if (Status != -1 && Parent) {
//		Parent->MouseMove(X,Y);
//	}

	if (ScrollButtonClick) {
		ValueM2 = ((long)(Y - Top - 17) * (Max - Min) * 2) / (Height - 50);
		Value = (ValueM2 >> 1) + Min;
		if (ValueM2 & 0x01)
			++Value;
		SetValue(Value);
	}
	return Status;
}

void CScrollBar::MouseUp()
{
	if (TopButtonClick || BottomButtonClick) {
		TopButtonClick = false;
		BottomButtonClick = false;
		Refresh();
	}
	else
		ScrollButtonClick = false;
	MouseAction = false;
	if (Parent && HandlerClass)
		Parent->SetFocusWnd((CControl *)HandlerClass,false);
}


void CScrollBar::Draw(long, long, long, long)
{
	register int ScrollPos;

	if (Ctl3D) {
		Graph->HLine(0,0,17,18);
		Graph->VLine(0,1,Height - 2,18);
		Graph->HLine(1,Height - 1,17,21);
		Graph->VLine(17,1,Height - 2,21);
	}
	Graph->Bar(1,1,16,Height - 2,20);
	DrawButton(1,TopButtonClick ? BUTTON_DOWN : BUTTON_UP,true,Enabled);
	DrawButton(Height - 17,BottomButtonClick ? BUTTON_DOWN : BUTTON_UP,false,Enabled);
	if (Enabled) {
		ScrollPos = 17 + ((long)(Value - Min) * (Height - 50)) / (Max - Min);
		DrawButton(ScrollPos,BUTTON_SCROLL,true,true);
	}
}

void CScrollBar::DrawButton(int Top, int Button, int UpArrow, int Enabled)
{
	if (Button == BUTTON_DOWN) {
		Graph->Rectangle(1,Top,16,16,18);
		DrawArrow(UpArrow,false,true);
	}
	else {
		if (MouseIsOver && Enabled) {
			Graph->HLine(1,Top + 15,16,17);
			Graph->VLine(16,Top,15,17);

			Graph->HLine(2,Top + 1,13,21);
			Graph->VLine(2,Top + 2,12,21);

			Graph->HLine(2,Top + 14,14,18);
			Graph->VLine(15,Top + 1,13,18);
		}
		else {
			Graph->HLine(1,Top + 15,16,18);
			Graph->VLine(16,Top,15,18);

			Graph->HLine(2,Top + 1,13,21);
			Graph->VLine(2,Top + 2,12,21);
		}
		if (Button == BUTTON_UP)
			DrawArrow(UpArrow,true,Enabled);
	}
}

void CScrollBar::DrawArrow(int UpArrow, int ButtonUp, int Enabled)
{
	int Left, Top, Color;

	if (ButtonUp) {
		Left = 0;
		Top = 0;
	}
	else {
		Left = 1;
		Top = 1;
	}
	if (UpArrow) {
		Left += 8;
		Top += 7;
		if (Enabled)
			Color = 17;
		else {
			Color = 18;
			Graph->HLine(Left - 2,Top + 4,7,21);
		}
		Graph->PutPixel(Left,Top,Color);
		Graph->HLine(Left - 1,Top + 1,3,Color);
		Graph->HLine(Left - 2,Top + 2,5,Color);
		Graph->HLine(Left - 3,Top + 3,7,Color);
	}
	else {
		Left += 5;
		Top += Height - 11;
		if (Enabled)
			Color = 17;
		else {
			Color = 18;
			Graph->Line(Left + 4,Top + 3,Left + 6,Top + 1,21);
			Graph->Line(Left + 4,Top + 4,Left + 7,Top + 1,21);
		}
		Graph->HLine(Left,Top,7,Color);
		Graph->HLine(Left + 1,Top + 1,5,Color);
		Graph->HLine(Left + 2,Top + 2,3,Color);
		Graph->PutPixel(Left + 3,Top + 3,Color);
	}
}


⌨️ 快捷键说明

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