Низкоуровневая графика в Amibroker
Встроенный язык Амиброкера (AFL) предоставляет неплохие возможности для интерактивного общения с алгоритмом. Можно использовать кнопки, строить меню и даже двигать объекты по экрану.
Вот пример, иллюстрирующий рисование объекта, выбор его мышью и передвижение на новое место. В принципе, этих способов достаточно для построения интерфейсов для управления любыми алгоритмами в Амиброкере.
function DrawButton( Text, x1, y1, x2, y2, BackColor )
{
GfxSetOverlayMode( 0 );
GfxSelectFont( "Tahoma", 12, 800 );
GfxSelectPen( colorBlack );
GfxSetBkMode( 1 );
GfxSelectSolidBrush( BackColor );
GfxSetBkColor( BackColor );
GfxSetTextColor( 1 );
GfxRectangle( x1, y1, x2, y2 );
GfxDrawText( Text, x1, y1, x2, y2, 32 | 1 | 4 );
}
ParamSqrSize = 100;
Reset = ParamTrigger( "Reset Coordinates", "RESET" );
xOffset = StaticVarGet( "xOffset" );
YOffset = StaticVarGet( "YOffset" );
if ( IsNull( xOffset ) OR IsNull( yOffset ) OR Reset )
{
StaticVarSet( "xOffset", 20 );
StaticVarSet( "yOffset", 20 );
X1 = XOffset;
Y1 = YOffset;
X2 = XOffset + ParamSqrSize;
Y2 = YOffset + ParamSqrSize;
StaticVarSet( "X1", X1 );
StaticVarSet( "X2", X2 );
StaticVarSet( "Y1", Y1 );
StaticVarSet( "Y2", Y2 );
StaticVarSet( "MoveinProgress", False );
}
X1 = Nz( StaticVarGet( "X1" ) );
X2 = Nz( StaticVarGet( "X2" ) );
Y1 = Nz( StaticVarGet( "Y1" ) );
Y2 = Nz( StaticVarGet( "Y2" ) );
LButtonTrigger = GetCursorMouseButtons() == 9;
MousePx = Nz( GetCursorXPosition( 1 ) );
MousePy = Nz( GetCursorYPosition( 1 ) );
CursorInField = MousePx > X1 AND MousePx < X2 AND MousePy > Y1 AND MousePy < Y2;
MoveInProgress = Nz( StaticVarGet( "MoveInProgress" ) );
BackColor = colorYellow;
if ( NOT MoveInProgress )
{
if ( LButtonTrigger AND CursorInField )
{
StaticVarSet( "BackColor", colorRed );
StaticVarSet( "DownPx1", MousePx );
StaticVarSet( "DownPy1", MousePy );
StaticVarSet( "MoveinProgress", True );
}
}
else
if ( LButtonTrigger )
{
StaticVarSet( "BackColor", colorYellow );
DownPx1 = StaticVarGet( "DownPx1" );
DownPy1 = StaticVarGet( "DownPy1" );
xMove = MousePx - DownPx1;
yMove = MousePy - downPy1;
PrevxOffset = StaticVarGet( "xOffset" );
PrevYOffset = StaticVarGet( "YOffset" );
xOffset = PrevxOffset + xMove;
yOffset = PrevYOffset + yMove;
StaticVarSet( "xOffset", xOffset );
StaticVarSet( "yOffset", yOffset );
StaticVarSet( "MoveinProgress", False );
}
BackColor = Nz( StaticVarGet( "BackColor" ), colorYellow );
xOffset = StaticVarGet( "xOffset" );
YOffset = StaticVarGet( "YOffset" );
X1 = XOffset;
Y1 = YOffset;
X2 = XOffset + ParamSqrSize;
Y2 = YOffset + ParamSqrSize;
StaticVarSet( "X1", X1 );
StaticVarSet( "X2", X2 );
StaticVarSet( "Y1", Y1 );
StaticVarSet( "Y2", Y2 );
DrawButton( "TEST", x1, y1, x2, y2, BackColor );
Этот пример рисует на экране прямоугольник желтого цвета, отслеживает клик на нем и по второму клику перемещает его на новое место. При этом цвет прямоугольника изменяется.
См. также:
