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

📄 sgrnumbertextcontrol.cpp

📁 一个基于BREW上的电子时钟程序,通过太阳历计算当前时间,并有闹铃和日志功能.
💻 CPP
字号:
//
//      SGRNumberTextControl.cpp
//
//      Copyright (C) 2006 Sophia Cradle Incorporated

#include "SGRNumberTextControl.hpp"

#define SGRNUMBERTEXTCONTROL_TEXT_COLOR		0, 0, 0, 0			// 暥帤偺怓
#define SGRNUMBERTEXTCONTROL_BG_COLOR		255, 255, 255, 0	// 攚宨偺怓

SGRNumberTextControl::SGRNumberTextControl(SFRResponderPtr responder, SFXRectangleConstRef rect, SInt32 digit, SInt32 min, SInt32 max, SInt32 defaultValue) : SFRControl(responder, rect, SFXMargin(3, 3, 3, 3), SFMRESPONDERFILTER(NUMBERTEXTCONTROL, BEHAVIOR_NUMBERTEXTCONTROL), ATTRIBUTE_NUMBERTEXTCONTROL), _digit(digit), _minValue(min), _maxValue(max), _currentDigit(0), _value(defaultValue)
{
	if (_digit < 1) {
		_digit = 1;
	}
	if (_minValue < 0) {
		// 晧偺悢偼庢傝埖偊側偄
		_minValue = 0;
	}
	if (_maxValue < _minValue) {
		_maxValue = _minValue;
	}
	if (_value < _minValue) {
		_value = _minValue;
	}
	if (_value > _maxValue) {
		_value = _maxValue;
	}

	// 僀儀儞僩 僴儞僪儔偺搊榐
	if (static_try()) {
		static_throw(RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey)));
	}
	if (static_try()) {
		static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_BASE, HANDLER_BEFORE, HANDLER_FUNCTION(OnBase)));
	}
	if (static_try()) {
		static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT, HANDLER_BEFORE, HANDLER_FUNCTION(OnContent)));
	}
}

SGRNumberTextControl::~SGRNumberTextControl(Void)
{
}

Void SGRNumberTextControl::ProcessNumberKey(SInt32 d)
{
	if (_currentDigit == 0) {
		_value = d;
		++_currentDigit;
	}
	else if (_currentDigit < _digit) {
		_value = 10 * _value + d;
		++_currentDigit;
	}
	if (_currentDigit >= _digit) {
		// 椬偺儗僗億儞僟傊僼僅乕僇僗傪堏摦
		_currentDigit = 0;
		if (_value < _minValue) {
			_value = _minValue;
		}
		else if (_value > _maxValue) {
			_value = _maxValue;
		}
		else {
			GetDirector()->FocusNext();
		}
	}
}

// 僉乕 僀儀儞僩 僴儞僪儔
HANDLER_IMPLEMENT_BOOLEVENT(SGRNumberTextControl, OnKey, event)
{
	Bool result(true);
	SInt32 val(0);

	switch (event.GetP16()) {
	case AVK_0:
		ProcessNumberKey(0);
		break;
	case AVK_1:
		ProcessNumberKey(1);
		break;
	case AVK_2:
		ProcessNumberKey(2);
		break;
	case AVK_3:
		ProcessNumberKey(3);
		break;
	case AVK_4:
		ProcessNumberKey(4);
		break;
	case AVK_5:
		ProcessNumberKey(5);
		break;
	case AVK_6:
		ProcessNumberKey(6);
		break;
	case AVK_7:
		ProcessNumberKey(7);
		break;
	case AVK_8:
		ProcessNumberKey(8);
		break;
	case AVK_9:
		ProcessNumberKey(9);
		break;
	case AVK_CLR:
		_value = -1;
		_currentDigit = 0;
		break;
	case AVK_LEFT:
		_currentDigit = 0;
		GetDirector()->FocusPrevious();
		break;
	case AVK_RIGHT:
		_currentDigit = 0;
		GetDirector()->FocusNext();
		break;
	case AVK_UP:
		if (_value < 0) {
			// 僋儕傾 僉乕偱撪梕偑徚嫀偝傟偰偄偨応崌
			_value = _minValue;
		}
		else {
			val = _value + 1;
			_value = (val > _maxValue) ? _minValue : val;
		}
		_currentDigit = 0;
		InvalidateContent();
		break;
	case AVK_DOWN:
		if (_value < 0) {
			// 僋儕傾 僉乕偱撪梕偑徚嫀偝傟偰偄偨応崌
			_value = _maxValue;
		}
		else {
			val = _value - 1;
			_value = (val < _minValue) ? _maxValue : val;
		}
		_currentDigit = 0;
		InvalidateContent();
		break;
	default:
		result = false;
		break;
	}

	return result;
}

HANDLER_IMPLEMENT_VOIDRENDER(SGRNumberTextControl, OnBase, graphics)
{
	SFXRectangle rect(GetBaseWorld());
	SFXBevelColor frameRGB(SFXRGBColor(0xAA, 0xAA, 0xAA, 0x00), SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00), SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00));
	SFXRGBColor color;

	if (GetInheritEnable()) {
		graphics->DrawBevelRectangle(rect, frameRGB);
		rect.Deflate(1, 1);
		graphics->DrawRectangle(rect, SFXRGBColor(0x00, 0x00, 0x00, 0x00));
		if (GetInheritFocus()) {
			rect.Deflate(1, 1);
			if (GetInheritTarget()) {
				color.Set(0xFF, 0x00, 0x00, 0x00);
			}
			else {
				color.Set(0x00, 0xFF, 0x00, 0x00);
			}
			graphics->DrawRectangle(rect, color);
		}
	}
	else {
		graphics->FillRectangle(rect, frameRGB.GetBase());
		rect.Deflate(1, 1);
		graphics->DrawRectangle(rect, SFXRGBColor(0x66, 0x66, 0x66, 0x00));
	}
}

HANDLER_IMPLEMENT_VOIDRENDER(SGRNumberTextControl, OnContent, graphics)
{
	SFXRectangleConst rect(GetContentWorld());
	SFXRGBColor textColor(SGRNUMBERTEXTCONTROL_TEXT_COLOR), bgColor(SGRNUMBERTEXTCONTROL_BG_COLOR);

	if (!GetInheritEnable()) {
		textColor.AddRGB(0x11);
		bgColor.SubRGB(0x11);
	}

	graphics->ClearRectangle(rect, bgColor);
	if (_value >= 0) {
		graphics->DrawText(SFXWideString::Format("%d", _value), rect, textColor, IDF_ALIGN_RIGHT | IDF_ALIGN_MIDDLE);
	}
}

⌨️ 快捷键说明

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