Галерея UI написанных на MQL - страница 35

 

По теме привязок добавлю, что есть строгие правила и нет смысла сейчас пытаться экспериментировать с ними. Подождите более полного объяснения.

Есть привязки которые работают отдельно для групп элементов и есть те что работают с отдельными элементами внутри групп. Также есть привязки которые подходят для расположения объектов внутри элементов (как текст или иконки). 

Поэтому об этом позже.

 
Реter Konow #:

Сегодня закончим с перечислениями, раз мы начали о них говорить вчера.

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

Пока продолжим знакомится с элементами управления и привязками. 

 

На сегодняшний день, в большинстве случаев, мы имели дело с простой кнопкой BUTTON. Все знают что такое кнопка, вещь самопонятная. Но в некоторые подробности стоит углубиться. Это же касается и других элементов с которыми мы работали ранее. Сделаем так: сначала пробежимся по основным характеристиками и функциям, затронем все в общих чертах, а потом остановимся на каждом элементе отдельно для более подробного рассмотрения.

И так, кнопка - интерактивный элемент меняющий состояние при нажатии. В графическом интерфейсе применяется для разных целей. В основном включить или выключить что то, но иногда вызвать окно. Вариантов применения простой кнопки много. Это вполне универсальный элемент.

А какие еще элементы мы рассмотрели? Например CHECKBOX. Зачем нужен чекбокс? Чекбокс необходим для включения, отключения или блокировки опций в настройках программы. Если же нужен выбор между несколькими опциями, подходит элемент R_BUTTON (радиокнопка). Но при условии что опций лишь несколько штук.

А если опций значительно, но не чрезмерно больше? Тогда применяется выпадающий список D_LIST или комбо-список C_LIST. Разница между этими двумя элементами в наличии или отсутствии текстового поля ввода, куда пользователь может ввести желаемый выбор.  D_LIST обладает таким полем, С_LIST нет.

А что делать, когда опций в программе становиться непомерно много? Выпадающие списки становятся неудобы из за малого размера. Выход - длинные прокручиваемые листы в больших окнах. Можно посмотреть примеры в окнах шрифтов, звуков и рамок конструктора.

Но, данные списки нуждаются в полосе прокрутки. Ведь они очень длинные. И поэтому для них существует специальный элемент. "Поле обзора" V_BOX. Простой элемент с двумя полосами прокрутки и собственным канвасом. Кстати, прокрутка у него как вертикальная, так и горизонтальная. А размеры канваса устанавливаются автоматически от расчета помещаемого контента.

Пунктами списка называются элементы L_ITEM, что сокращение от "List Item". Они собираются в отдельную группу и рисуются на канвасе указанного поля обзора. Каждый элемент именуется названием пункта меню или опции и переключаются они одним к.словом SWITCH_ALL. А для внесения списка элементов L_ITEM в поле обзора V_BOX, используется ключевое слово "IN". Позиционирование простое - LEFT_TOP, 0,0,.


Далее рассмотрим перечисленные элементы подробнее и в том же порядке. Мы поговорим о позиционировании, состояниях, свойствах и атрибутах.

...И рассмотрим варианты применения в контексте трейдерских программ.

 

Обыкновенная кнопка: BUTTON

4 разновидности кнопок конструктора:

Имеет относительно устаревший вид и простой функционал как и любая классическая кнопка. Есть иконка. 


//-------------------------------------------------------------------------------------------------------------------------------------

  • Интерактивная кнопка I_BUTTON - interactive button:

 Красивая интерактивная кнопка плавно реагирующая на наведение/отведение курсора. Используется как и обычная кнопка, но менее заметна и в нейтральном состоянии не имеет обрисованных границ. В основном без текста и с иконкой. Чаще квадратной формы.  


//-------------------------------------------------------------------------------------------------------------------------------------

  • Кнопка тулбара (как на МТ4) TB_BUTTON - Toolbar button:

В основном используется для тулбара в шапке главного окна. Часто без текста, но с иконкой и обычно квадратной формы. Прилипает к курсору при наведении. Вызывает окна или функции. Имеет стрелку.


//-------------------------------------------------------------------------------------------------------------------------------------

  • Кнопка диалоговых окон - D_BUTTON - dialog button:

Ставится внизу диалоговых окон для взаимодействия с пользователем. Несет такие тексты как "Ок", "Yes", "No", "Cancel", "Abort", "Continue", "Accept", "Next", "Previous", "Skip", "Confirm", "Open", "Close",... и другие слова этого жанра.


На всех кнопках можно устанавливать иконки и текст, а также цвет для различных состояний.

При этом, кнопки могут менять текст и иконку в зависимости от состояния. В нейтральном один текст или иконка, а в активированном - другой.


Например:

Все кнопки отжаты и находятся в нейтральном состоянии:


А теперь мы их нажали и они сменили текст и иконку:  (кроме диалоговой кнопки, так как она после нажатия закрывает окно и в этом нет необходимости)


Текст интерактивной кнопки накладывается на иконку, но так задумано, потому что есть возможность позиционировать иконку и текст внутри кнопки.

 

Таким образом, кнопки могут менять текст при нажатии. Причем, текст и имя кнопки - разные вещи. Текст для нейтрального состояния можно задать словом N_TEXT, и вместо имени кнопки появится другой текст пользователя.

Для иконки тоже самое. Задается иконка для нейтрального состояния и для активного.


Код:

NEW_WINDOW,  
//------------------------------------------------------
/*SET WINDOW TYPE*/         W_TYPE, SETTINGS,  
//------------------------------------------------------
/*WRITE WINDOW'S NAME*/     W_NAME, "My first window",
//------------------------------------------------------
/*POINT TO WINDOW'S ICON*/  W_ICON, "::Images\\16x16\\Smile.bmp",  
//------------------------------------------------------

//------------------------------------------------------
/*SET WINDOW'S ADDITIONAL PROPERTIES*/   
//----------------------------------------------------------------------------------
/*WINDOW OPENS AT START*/   OPEN_ON_INIT,  /*(OOI)*/

/*WINDOW IS ALWAYS ON TOP*/ ALWAYS_ON_TOP, /*(OOT)*/  

/*MARGINS OF THE WINDOW*/   MARGINS, 40,40,/*Х, Y*/
//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
//1. DECLARE A GROUP WITH AN ABSTRACT NAME  A.
//2. DECLARE A NEW ROW OF ELEMENTS IN THE GROUP WITH A SYMBOL  __, 
//3. DECLARE A BUTTON AND WRITE IT'S NAME.
//4. END GROUP WITH THE KEYWORDS  END_GROUP,
//------------------------------------------------------
GROUP, "Buttons group",

__, BUTTON,   "Button 1", W, 120,_,H, 50,   D_BUTTON, "D button 1",   W, 120,_,H, 50,

__, I_BUTTON, "I Button", W, 120,_,H, 50,   TB_BUTTON, "TB button 1", W, 120,_,H, 50, 

END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 30,
//--------------------------
i, X_GAP, 30,
i, Y_GAP, 20,
//----------------------------
//SET MAIN PROPERTIES (IF YOU DON'T, THEY WILL HAVE DEFAULT VALUES): 
//----------------------------
"Button 1",    N_TEXT,  "Neutral state",

"Button 1",    A_TEXT,  "Active state",

"Button 1",    N_LABEL, "::Images\\16x16\\About.bmp",

"Button 1",    A_LABEL, "::Images\\16x16\\3d bar chart.bmp",

"Button 1",    FIC,
//----------------------------

//----------------------------
"I Button",    N_TEXT,  "Neutral", 

"I Button",    A_TEXT,  "Active",

"I Button",    N_LABEL, "::Images\\16x16\\Accounting.bmp",

"I Button",    A_LABEL, "::Images\\16x16\\Address book.bmp", 

"I Button",    FIC,
//----------------------------

//----------------------------
"D button 1",    N_TEXT,  "Also Neutral",

"D button 1",    A_TEXT,  "Also Active",

"D button 1",    N_LABEL, "::Images\\16x16\\Alarm clock.bmp",

//----------------------------

//----------------------------
"TB button 1",    N_TEXT,  "TB Neutral",

"TB button 1",    A_TEXT,  "TB Active",

"TB button 1",    N_LABEL, "::Images\\16x16\\Alarm clock.bmp",

"TB button 1",    A_LABEL,  "::Images\\16x16\\Address book.bmp", 

"TB Button 1",    FIC,

//------------------------------------------------------
//FINISH THE WINDOW BY KEYWORDS END_WINDOW,
//------------------------------------------------------
END_WINDOW,
//----------------------------------------------------------------------------------
 

Пожалуй одна из главных функций кнопок - вызов окон. Нажимаем на кнопку в одном окне и открывается другое окно.

Как это делается?

Двумя способами:

  • Пишем ключевое слово OPENS_WINDOW в свойствах кнопки и далее имя вызываемого окна.
  • Либо называем кнопку также как окно которое она должна вызывать и прячем текст кнопки. Или переопределяем текст кнопки словами N_TEXT и A_TEXT.

Важно заметить: совпадение названия кнопок или пунктов меню с названиями окон приводит к открытию данных окон при нажатии на эти элементы.

//+------------------------------------------------------------------+
//|                                              My first window.mqh |
//+------------------------------------------------------------------+
//DECLARE A NEW WINDOW
//----------------------------------------------------------------------------------
NEW_WINDOW, 
//------------------------------------------------------
/*SET WINDOW TYPE*/         W_TYPE, SETTINGS,  
//------------------------------------------------------
/*WRITE WINDOW'S NAME*/     W_NAME, "Just a window",
//------------------------------------------------------
/*SET WINDOW'S ADDITIONAL PROPERTIES*/   
//------------------------------------------------------ 
/*WINDOW IS ALWAYS ON TOP*/ ALWAYS_ON_TOP, /*(OOT)*/  
//------------------------------------------------------

END_WINDOW,
//----------------------------------------------------------------------------------




//DECLARE A NEW WINDOW
//----------------------------------------------------------------------------------
NEW_WINDOW,  
//------------------------------------------------------
/*SET WINDOW TYPE*/         W_TYPE, SETTINGS,  
//------------------------------------------------------
/*WRITE WINDOW'S NAME*/     W_NAME, "My first window",
//------------------------------------------------------
/*POINT TO WINDOW'S ICON*/  W_ICON, "::Images\\16x16\\Smile.bmp",  
//------------------------------------------------------

//------------------------------------------------------
/*SET WINDOW'S ADDITIONAL PROPERTIES*/   
//----------------------------------------------------------------------------------
/*WINDOW OPENS AT START*/   OPEN_ON_INIT,  /*(OOI)*/

/*WINDOW IS ALWAYS ON TOP*/ ALWAYS_ON_TOP, /*(OOT)*/  

/*MARGINS OF THE WINDOW*/   MARGINS, 40,40,/*Х, Y*/
//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
//1. DECLARE A GROUP WITH AN ABSTRACT NAME  A.
//2. DECLARE A NEW ROW OF ELEMENTS IN THE GROUP WITH A SYMBOL  __, 
//3. DECLARE A BUTTON AND WRITE IT'S NAME.
//4. END GROUP WITH THE KEYWORDS  END_GROUP,
//------------------------------------------------------
GROUP, "Buttons group",

__, BUTTON,  "Just a window", W, 150, //the button WILL call the window due to sharing the same name.   

END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 30,
//--------------------------
i, X_GAP, 30,
i, Y_GAP, 20,
//----------------------------
//SET MAIN PROPERTIES (IF YOU DON'T, THEY WILL HAVE DEFAULT VALUES): 
//----------------------------
"Just a window",    N_TEXT,  "Press to open",//redefine text on the button

"Just a window",    N_LABEL, "::Images\\16x16\\Alarm clock.bmp",
//------------------------------------------------------
//FINISH THE WINDOW BY KEYWORDS END_WINDOW,
//------------------------------------------------------
END_WINDOW,
//----------------------------------------------------------------------------------


И второй вариант:

//+------------------------------------------------------------------+
//|                                              My first window.mqh |
//+------------------------------------------------------------------+
//DECLARE A NEW WINDOW
//----------------------------------------------------------------------------------
NEW_WINDOW, 
 
//------------------------------------------------------
/*SET WINDOW TYPE*/         W_TYPE, SETTINGS,  
//------------------------------------------------------
/*WRITE WINDOW'S NAME*/     W_NAME, "Just a window",
//------------------------------------------------------
/*SET WINDOW'S ADDITIONAL PROPERTIES*/   
//------------------------------------------------------ 
/*WINDOW IS ALWAYS ON TOP*/ ALWAYS_ON_TOP, /*(OOT)*/  
//------------------------------------------------------

END_WINDOW,
//----------------------------------------------------------------------------------




//DECLARE A NEW WINDOW
//----------------------------------------------------------------------------------
NEW_WINDOW,  
//------------------------------------------------------
/*SET WINDOW TYPE*/         W_TYPE, SETTINGS,  
//------------------------------------------------------
/*WRITE WINDOW'S NAME*/     W_NAME, "My first window",
//------------------------------------------------------
/*POINT TO WINDOW'S ICON*/  W_ICON, "::Images\\16x16\\Smile.bmp",  
//------------------------------------------------------

//------------------------------------------------------
/*SET WINDOW'S ADDITIONAL PROPERTIES*/   
//----------------------------------------------------------------------------------
/*WINDOW OPENS AT START*/   OPEN_ON_INIT,  /*(OOI)*/

/*WINDOW IS ALWAYS ON TOP*/ ALWAYS_ON_TOP, /*(OOT)*/  

/*MARGINS OF THE WINDOW*/   MARGINS, 40,40,/*Х, Y*/
//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
//1. DECLARE A GROUP WITH AN ABSTRACT NAME  A.
//2. DECLARE A NEW ROW OF ELEMENTS IN THE GROUP WITH A SYMBOL  __, 
//3. DECLARE A BUTTON AND WRITE IT'S NAME.
//4. END GROUP WITH THE KEYWORDS  END_GROUP,
//------------------------------------------------------
GROUP, "Buttons group",

__, BUTTON,  "Press to open", W, 150,   

END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 30,
//--------------------------
i, X_GAP, 30,
i, Y_GAP, 20,
//----------------------------
//SET MAIN PROPERTIES (IF YOU DON'T, THEY WILL HAVE DEFAULT VALUES): 
//----------------------------
"Press to open", OPENS_WINDOW, "Just a window",//opens the window by the keyword 

"Press to open", N_LABEL, "::Images\\16x16\\Alarm clock.bmp",
//------------------------------------------------------
//FINISH THE WINDOW BY KEYWORDS END_WINDOW,
//------------------------------------------------------
END_WINDOW,
//----------------------------------------------------------------------------------



Результат:


 

Ну и напоследок сегодня:

Прячем текст кнопки с помощью к.слов

_,text, IS_HIDDEN,

Пример:


Код:

//------------------------------------------------------
GROUP, "Buttons group",

__, BUTTON,  "Press to open", W, 150, _,text, IS_HIDDEN,  

END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 30,
//--------------------------
i, X_GAP, 30,
i, Y_GAP, 20,
//----------------------------
//SET MAIN PROPERTIES (IF YOU DON'T, THEY WILL HAVE DEFAULT VALUES): 
//----------------------------
"Press to open", OPENS_WINDOW, "Just a window",

"Press to open", N_LABEL, "::Images\\16x16\\Alarm clock.bmp",
//------------------------------------------------------
 
Узнал много нового.
 

Готовлю обновление и сегодня урок не состоится. Интересующиеся материалом могут отдохнуть день-другой. :) 

Продолжим на новом билде конструктора.

 
Большая просьба к людям которые пробуют создавать интерфейс или тестируют конструктор. Пожалуйста сообщайте обо всех найденных багах. Обратная связь от вас очень важна. Заранее спасибо.