📄 sgrnumbertextcontrol.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 + -