Делаем кнопку на графике.

Часть 1.

Часто хочется иметь элементы управления прямо на графике. Амиброкер позволяет при помощи AFL рисовать на графике. При том можно не только нарисовать элемент управления, но и сделать его активным.

Нарисуем кнопку.

Для начала пусть это будет просто прямоугольник в левом верхнем углу графика. Пускай он будет синего цвета
GfxSelectSolidBrush( colorBlue );
GfxRectangle( 5, 20, 100, 50 );
Здесь первая строка это цвет «кисти» которым будем закрашивать наш прямоугольник, а вторая строка это собственно сам прямоугольник.
Что обозначают цифры?
Первые 2 это координаты левого верхнего угла прямоугольника, а вторые 2 координаты правого нижнего угла. Т.е. 5 это отступ левого угла прямоугольника от левой стороны графика, а 20 это отступ левого угла прямоугольника от верхней стороны.

Ну и напишем на кнопке текст.
GfxSelectFont("Tahoma", 15, 700 );
GfxSetBkColor(colorBlue);
GfxSetTextColor(colorWhite);
GfxTextOut( "Кнопка", 15, 23 );
Что тут для чего можно посмотреть в справке и поэкспериментировать меняя цифры.

 pic

Пока наша кнопка совсем ничего не делает и никак не реагирует на мышь. Исправим это.
Воспользуемся функциями GetCursorXPosition() и GetCursorYPosition()
MouseOnBut = 
	GetCursorXPosition( 1 ) > 5 AND 
	GetCursorXPosition( 1 ) < 100 AND 
	GetCursorYPosition( 1 ) > 20 AND 
	GetCursorYPosition( 1 ) < 50; 
Теперь Ами «знает», что мышка наведена на нашу «кнопку».
Ну наведена, а надо отследить клик.
ClikBut = GetCursorMouseButtons() == 9; 
GetCursorMouseButtons() == 9 отслеживает клик левой кнопки мыши. Есть возможность отследить клик правой, средней кнопкой и любые комбинации.(см. справку)
Теперь если курсор находится над кнопкой и была нажата левая кнопка, то типа произошло нажатие на кнопку.
if(MouseOnBut AND ClikBut)
{
	// тут можно написать, что делать при нажатии.
}
Например при нажатии выводим на график RSI(14).
MouseOnBut = 
	GetCursorXPosition( 1 ) > 5 AND 
	GetCursorXPosition( 1 ) < 100 AND 
	GetCursorYPosition( 1 ) > 20 AND 
	GetCursorYPosition( 1 ) < 50; 
	
ClikBut = GetCursorMouseButtons() == 9;  

if(MouseOnBut AND ClikBut)
{
	Plot(RSI(14), "", colorRed);
}

GfxSelectSolidBrush( colorBlue );
GfxRectangle( 5, 20, 100, 50 );
GfxSelectFont("Tahoma", 15, 700 );
GfxSetBkColor(colorBlue);
GfxSetTextColor(colorWhite);
GfxTextOut( "Кнопка", 15, 23 );
Ага, теперь при клике на «кнопке» на графике появляется график RSI(14) и при следующем прогоне AFL кода он сразу пропадет.
Плохо только одно, наша кнопка никак не показывает что отреагировала на наши действия. Пусть она меняет цвет при нажатии.
MouseOnBut = 
	GetCursorXPosition( 1 ) > 5 AND 
	GetCursorXPosition( 1 ) < 100 AND 
	GetCursorYPosition( 1 ) > 20 AND 
	GetCursorYPosition( 1 ) < 50; 
	
ClikBut = GetCursorMouseButtons() == 9;  

color = colorBlue;
if(MouseOnBut AND ClikBut)
{
	color = colorRed;
	Plot(RSI(14), "", colorRed);
}

GfxSelectSolidBrush( color );
GfxRectangle( 5, 20, 100, 50 );
GfxSelectFont("Tahoma", 15, 700 );
GfxSetBkColor(color);
GfxSetTextColor(colorWhite);
GfxTextOut( "Кнопка", 15, 23 );              

 pic

 pic

Такое поведение можно применять если требуется при нажатии кнопки выполнить какое либо действие один раз.
Например:
экспортировать какие либо данные во внешний файл,
отправить заявку на сделку
и т.п.

Продолжение следует.

Удачи.