По теме привязок добавлю, что есть строгие правила и нет смысла сейчас пытаться экспериментировать с ними. Подождите более полного объяснения.
Есть привязки которые работают отдельно для групп элементов и есть те что работают с отдельными элементами внутри групп. Также есть привязки которые подходят для расположения объектов внутри элементов (как текст или иконки).
Сегодня закончим с перечислениями, раз мы начали о них говорить вчера.
Все таки, хорошо подумав, решил отложить завершение темы перечислений. Понимание дальнейшего материала этой темы требует базовых знаний правил языка которых у читателей еще нет.
Пока продолжим знакомится с элементами управления и привязками.
На сегодняшний день, в большинстве случаев, мы имели дело с простой кнопкой 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,.
Далее рассмотрим перечисленные элементы подробнее и в том же порядке. Мы поговорим о позиционировании, состояниях, свойствах и атрибутах.
...И рассмотрим варианты применения в контексте трейдерских программ.
Красивая интерактивная кнопка плавно реагирующая на наведение/отведение курсора. Используется как и обычная кнопка, но менее заметна и в нейтральном состоянии не имеет обрисованных границ. В основном без текста и с иконкой. Чаще квадратной формы.
Кнопка тулбара (как на МТ4) TB_BUTTON - Toolbar 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,
//----------------------------------------------------------------------------------
//------------------------------------------------------
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",
//------------------------------------------------------
Большая просьба к людям которые пробуют создавать интерфейс или тестируют конструктор. Пожалуйста сообщайте обо всех найденных багах. Обратная связь от вас очень важна. Заранее спасибо.
По теме привязок добавлю, что есть строгие правила и нет смысла сейчас пытаться экспериментировать с ними. Подождите более полного объяснения.
Есть привязки которые работают отдельно для групп элементов и есть те что работают с отдельными элементами внутри групп. Также есть привязки которые подходят для расположения объектов внутри элементов (как текст или иконки).
Поэтому об этом позже.
Сегодня закончим с перечислениями, раз мы начали о них говорить вчера.
Все таки, хорошо подумав, решил отложить завершение темы перечислений. Понимание дальнейшего материала этой темы требует базовых знаний правил языка которых у читателей еще нет.
Пока продолжим знакомится с элементами управления и привязками.
На сегодняшний день, в большинстве случаев, мы имели дело с простой кнопкой 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 разновидности кнопок конструктора:
Имеет относительно устаревший вид и простой функционал как и любая классическая кнопка. Есть иконка.
//-------------------------------------------------------------------------------------------------------------------------------------
Красивая интерактивная кнопка плавно реагирующая на наведение/отведение курсора. Используется как и обычная кнопка, но менее заметна и в нейтральном состоянии не имеет обрисованных границ. В основном без текста и с иконкой. Чаще квадратной формы.
//-------------------------------------------------------------------------------------------------------------------------------------
В основном используется для тулбара в шапке главного окна. Часто без текста, но с иконкой и обычно квадратной формы. Прилипает к курсору при наведении. Вызывает окна или функции. Имеет стрелку.
//-------------------------------------------------------------------------------------------------------------------------------------
Ставится внизу диалоговых окон для взаимодействия с пользователем. Несет такие тексты как "Ок", "Yes", "No", "Cancel", "Abort", "Continue", "Accept", "Next", "Previous", "Skip", "Confirm", "Open", "Close",... и другие слова этого жанра.
На всех кнопках можно устанавливать иконки и текст, а также цвет для различных состояний.
При этом, кнопки могут менять текст и иконку в зависимости от состояния. В нейтральном один текст или иконка, а в активированном - другой.
Например:
Все кнопки отжаты и находятся в нейтральном состоянии:
А теперь мы их нажали и они сменили текст и иконку: (кроме диалоговой кнопки, так как она после нажатия закрывает окно и в этом нет необходимости)
Текст интерактивной кнопки накладывается на иконку, но так задумано, потому что есть возможность позиционировать иконку и текст внутри кнопки.
Таким образом, кнопки могут менять текст при нажатии. Причем, текст и имя кнопки - разные вещи. Текст для нейтрального состояния можно задать словом N_TEXT, и вместо имени кнопки появится другой текст пользователя.
Для иконки тоже самое. Задается иконка для нейтрального состояния и для активного.
Код:
Пожалуй одна из главных функций кнопок - вызов окон. Нажимаем на кнопку в одном окне и открывается другое окно.
Как это делается?
Двумя способами:
Важно заметить: совпадение названия кнопок или пунктов меню с названиями окон приводит к открытию данных окон при нажатии на эти элементы.
И второй вариант:
Результат:
Ну и напоследок сегодня:
Прячем текст кнопки с помощью к.слов
Пример:
Код:
Готовлю обновление и сегодня урок не состоится. Интересующиеся материалом могут отдохнуть день-другой. :)
Продолжим на новом билде конструктора.