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

 
//+------------------------------------------------------------------+
//|                                                Язык разметки KIB |        
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
//---------------------------------
//УРОК 1.   
//---------------------------------

//---------------------------------
//СОДЕРЖАНИЕ:
//---------------------------------
1.   СОЗДАНИЕ ФОРМЫ ОКНА.

2.   ПРАВИЛА СОЗДАНИЯ ГРУПП ЭЛЕМЕНТОВ.

3.   ПРАВИЛА СОЗДАНИЯ ЭЛЕМЕНТОВ.

4.   ТИПЫ ЭЛЕМЕНТОВ.
//---------------------------------



//--------------------------------------------------------------------------------------------------+
//1. СОЗДАНИЕ ФОРМЫ ОКНА: 
//--------------------------------------------------------------------------------------------------+ 
ПОСЛЕДОВАТЕЛЬНОСТЬ КОММАНД:

1. ОБЪЯВЛЯЕМ НОВОЕ ОКНО: NEW_WINDOW,

2. ИМЕНУЕМ ОКНО:         W_NAME, "Window 1",

3. ВЫБИРАЕМ ИКОНКУ ОКНА ИЗ ОКНА ИКОНОК КОНСТРУКТОРА (ВЫЗЫВАЕТСЯ ДАБЛ-КЛИКОМ НА ГРАФИК) И ПРОПИСЫВАЕМ : W_LABEL, "::Images\\some_icon.bmp", 

4. УСТАНАВЛИВАЕМ ТИП ОКНА -  W_TYPE, SETTINGS, (ИЛИ DINAMIC, MENU, DIALOG).

//--------------------------------------------------------------------------------------------------+ 
NEW_WINDOW,     W_NAME, "Window 1",      W_LABEL, "::Images\\some_icon.bmp",       W_TYPE, SETTINGS,
//--------------------------------------------------------------------------------------------------+

5. ПОСЛЕ ОБЪЯВЛЕНИЯ ОКНА, ЗАВЕРШАЕМ ЕГО КОММАНДОЙ END_WINDOW,
//--------------------------------------------------------------------------------------------------+


//---------------------------------------------------------------------------------------------------
ОБЪЯВЛЕНИЕ ГРУПП ЭЛЕМЕНТОВ:
//---------------------------------------------------------------------------------------------------
1. ВСЕ ЭЛЕМЕНТЫ СУЩЕСТВУЮТ ТОЛЬКО В СВОИХ ГРУППАХ.

2. ВСЕ ГРУППЫ ОБЪЯВЛЯЮТСЯ КОММАНДОЙ GROUP И ОБЯЗАНЫ ИМЕТЬ ИМЯ. (ЕСЛИ ИМЯ НЕСУЩЕСТВЕННО, СТАВИТЬ А. без кавычек)

   GROUP, "Main tabs", или GROUP, A,


3. ВСЕ ГРУППЫ ЗАВЕРШАЮТСЯ КОММАНДОЙ END_GROUP.

4. ПОСЛЕ END_GROUP ПИШЕТСЯ ПОЗИЦИЯ ГРУППЫ И СВОЙСТВА ЭЛЕМЕНТОВ.

5. ГРУППА ОБЯЗАНЫ БЫТЬ ПОЗИЦИОНИРОВАНА. ДЛЯ ЭТОГО ИСПОЛЬЗУЕТСЯ ПРОСТОЙ МЕТОД:

i,(символ группы), AT, (ПОЗИЦИЯ) _Х2Х, (ТИП ПРИВЯЗКИ)  "name", (ИМЯ ОБЪЕКТА ПРИВЯЗКИ) 0 (ПОПРАВКА) И ТОЖЕ САМОЕ ДЛЯ ОСИ Y. 
//--------------------------------------------------------------------------------------------------+ 
         i, AT, _X2X, "MF", 5, _Y2Y, "MF",5,   ("MF" - ОЗНАЧАЕТ MAIN FRAME ОКНА,  5 - ПОПРАВКА)
//--------------------------------------------------------------------------------------------------+   
       
//--------------------------------------------------------------------------------------------------+
ПРИНЦИПЫ ПОСТРОЕНИЯ ГРУПП:

1. ЖЕЛАТЕЛЬНО, СТРОИТЬ ТАБЛИЧНУЮ РАСКЛАДКУ ЭЛЕМЕНТОВ ВНУТРИ ГРУПП - СТАВИТЬ РАВНОЕ КОЛИЧЕСТВО ЭЛЕМЕНТОВ В РЯДУ, - ОДНАКО, МОГУТ БЫТЬ ИСКЛЮЧЕНИЯ.

2. СТРОКА ОБЪЯВЛЕНИЙ ЭЛЕМЕНТОВ - ЭТО РЯД. (Ряд начинается со знака __,). 

3. КАЖДЫЙ ЭЛЕМЕНТ ОБЯЗАН ИМЕТЬ ИМЯ. ЭТО МОЖЕТ БЫТЬ ИМЯ СОБСТВЕННОЕ ИЛИ АБСТРАКТНОЕ A. ИМЯ СОБСТВЕННОЕ СТАВИТСЯ В КАВЫЧКИ. 

4. ВНУТРИ СТРОКИ ОБЪЯВЛЯЕНИЯ ЭЛЕМЕНТОВ, МОЖНО ПРОПИСЫВАТЬ УСТАНОВКИ ИХ ИНДИВИДУАЛЬНЫХ СВОЙСТВ. 

5. ПРИ УСТАНОВКИ СВОЙСТВ ВНУТРИ СТРОКИ ЭЛЕМЕНТОВ, СВОЙСТВА ПЕРЕЧЕСЛЯЮТСЯ ЧЕРЕЗ ЗНАК _, КОТОРЫЙ ОТСЫЛАЕТ КОНСТРУКТОР К НУЖНОМУ ЭЛЕМЕНТУ. 

__, M_ITEM, "M_ITEM 1", N_LABEL,"::Images\\some_icon.bmp", _,N_COLOR,(int)clrWhite,_,NB_COLOR,(int)clrWhite,_,AB_COLOR,(int)clrWhite, _,KC_TEXT,"Cntrl+Shift",

   В ИТОГЕ ПОЛУЧАЕТСЯ ЦЕПОЧКА СВОЙСТВ. ЕЕ МОЖНО ПЕРЕНОСИТЬ МЕЖДУ ЭЛЕМЕНТАМИ ИЛИ КОПИРОВАТЬ.
   
6. ДЛЯ ЗАДАНИЯ ДИСТАНЦИИ МЕЖДУ ЭЛЕМЕНТАМИ В ГРУППЕ ИСПОЛЬЗУЙТЕ СЛОВА X_GAP, Y_GAP. СТАВЬТЕ ИХ ПОСЛЕ ЗАВЕРШЕНИЯ ГРУППЫ.
//-------------------
   i, X_GAP, 5,
   i, Y_GAP, 5,
//-------------------  
//--------------------------------------------------------------------------------------------------+

 !!! КРАЙНЕ ВАЖНО: ЗАПРЕЩЕНО ДАВАТЬ ЭЛЕМЕНТАМ ОДИНАКОВЫЕ НАЗВАНИЯ ВНУТРИ ОДНОГО ОКНА. 
                   ЗАПРЕЩЕНО ДАВАТЬ ГРУППАМ ОДИНАКОВЫЕ НАЗВАНИЯ ВНУТРИ ОДНОГО ОКНА.
                   
                   ИСПОЛЬЗОВАНИЯ A ВМЕСТО ИМЕНИ НЕ ПРИВОДИТ К СОВПАДЕНИЮ ИМЕН.
                   //----------------------------------------------------------------
                   
 ПРИМЕР ПОСТРОЕНИЯ ГРУППЫ:                   
//--------------------------------------------------------------------------------------------------+
GROUP, A,

__, CHECKBOX, "Checkbox 1",  CHECKBOX, "Checkbox 2", 

__, CHECKBOX, "Checkbox 3",  CHECKBOX, "Checkbox 4",

__, CHECKBOX, "Checkbox 5",  CHECKBOX, "Checkbox 6",

__, CHECKBOX, "Checkbox 7",  CHECKBOX, "Checkbox 8",  

END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 10,
i, X_GAP, 30,
i, Y_GAP, 20,
//--------------------------------------------------------------------------------------------------+


!!! НЕ ЗАБЫВАЙТЕ ЗАВЕРШАТЬ ОКНА КОММАНДОЙ END_WINDOW И ГРУППЫ END_GROUP.
 

Пример простого кода:

//----------------------------------------------------------------------------------
NEW_WINDOW,                               //Объявление окна. (Писать ОБЯЗАТЕЛЬНО)

W_NAME, "Demo window 1",                  //Название окна. (Тоже ОБЯЗАТЕЛЬНО)

W_ICON, "::Images\\16x16\\Database.bmp",  //Иконка окна. (Указывать необязательно)

W_TYPE, SETTINGS,                         //Тип окна.(ОБЯЗАТЕЛЬНО)

OOI,                                      //Флаг открытия окна при инициализации.(Указывать необязательно)

MARGINS, 30,30,                           //Правый и нижний отступ рамки окна. (Указывать необязательно)
//----------------------------------------------------------------------------------
GROUP, A,  //Объявление группы элементов. Абстрактное имя (А). Писать обязательно.                           

__, CHECKBOX, "Some checkbox 1",      D_LIST, "Some list 1",              //Ряд 1

__, R_BUTTON, "Some radio button 1",  R_BUTTON, "Some radio button 2",    //Ряд 2


END_GROUP,    //Завершение группы элементов. Ставить обязательно.
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y, "MF", 10,     //Позиция всех группы элементов в окне относительно левого верхнего края.
i, X_GAP, 30,                              //Промежутки между элементами по оси Х.
i, Y_GAP, 30,                              //Промежутки между элементами по оси Y.  
//----------------------------------------------------------------------------------


GROUP, A,

__,L_ITEM, "L_ITEM  1",       
__,L_ITEM, "L_ITEM  2",
__,L_ITEM, "L_ITEM  3",
__,L_ITEM, "L_ITEM  4",
__,L_ITEM, "L_ITEM  5",
__,L_ITEM, "L_ITEM  6", ON,  //Включаем один из элементов списка по умолчанию.
__,L_ITEM, "L_ITEM  7",
__,L_ITEM, "L_ITEM  8",
__,L_ITEM, "L_ITEM  9",
__,L_ITEM, "L_ITEM  10",
__,L_ITEM, "L_ITEM  11",
__,L_ITEM, "L_ITEM  12",
__,L_ITEM, "L_ITEM  13",
__,L_ITEM, "L_ITEM  14",
__,L_ITEM, "L_ITEM  15",

END_GROUP,
//-------------------------
i, IN,"Some list 1",        //Указание в каком списке будут находиться элементы.
i, AT, LEFT_TOP, 0,0,       //Флаг позиции элементов группы наканвасе(Писать ОБЯЗАТЕЛЬНО)
i, Y_GAP, 2,                //Дистанция между пунктами списка. Есть значение по умолчанию. Можно явно задавать свое.
//----------------------------------------------------------------------------------


END_WINDOW, //(Писать ОБЯЗАТЕЛЬНО)

 



 
Реter Konow #:

Все некогда начатое нужно заканчивать. Даже если это никому не нужно. Таков принцип.

Нужно. Если интерфейс можно будет не только нарисовать, но и использовать. Надеюсь.

 
Edgar Akhmadeev #:

Нужно. Если интерфейс можно будет не только нарисовать, но и использовать. Надеюсь.

Несомненно. Над этим и работаю.

 
Можно ли удалить эту бессмысленную тему? Что это за русский код на немецком форуме? Кроме того, в ней нет никакой дополнительной пользы.
 
Можно ли удалить это сообщение? И закрыть немецкий форум?
 
Привет Петр. 
Вот, кстати, серьезный минус использование имен на русском. Это отсекает сразу более 90% нерусскоговорящих программистов. Ведь они видят какие-то квазилябры. Дублирование этой ветки на нескольких языках - это жесткое испытание, конечно, для нерусскоговорящих. 
Забегая вперед, можно задать тебе пару вопросов?
Ввиду того, что твой GUI создан без применения классов, сразу возникает несколько неопределенностей. 
Ведь, какие, в первую очередь, требования должны быть к GUI, как продукту?
Это удобство и интуитивность создания GUI, а так же удобное использование его в процессе работы.
В связи с этим:


Вопрос 1

Какой существует механизм для программиста обработки события со стороны твоего GUI?
Например, в моих GUI при создании элемента управления, я добавляю сразу указатель на функцию обработчик при наступления события изменения этого элемента.
Пример кода:

typedef void      (*TFuncSlider)(double);
typedef void      (*TFuncCheckList)(int);
typedef void      (*TFuncButton)(bool);
class Slider {
  ...
  TFuncSlider func;
  ...
}
class CheckList{...}
class CheckBox{...}
class Button{...}
class Menu{
  Slider sliders[];
  CheckList check_list[];
  CheckBox check_boxes[];
  Button buttons[];

..... 

menu.AddSlider(1,3,37.5,52,1.5,"Channel width = ",0,4,k_can,3,true,false,SetWidth,false); // Создание конкретного слайдера при формировании GUI, где SetWidth - указатель на функцию 


.....

void SetWidth(double wid) { // функция обработчик измениения состояния конкретного слайдера, которую пишет программист
   k_can = wid;
   ReDrawPol();
}



Вопрос 2

Как программисту получить доступ к состоянию конкретного элемента GUI?
Например, в моем GUI состояние checkbox (bool) я могу получить так:
if (menu1.check_boxes[ch.N].checked) {
  ....
}
else {
  ....
}

но я использую классы, вложенные друг в друга.
А как это сделать у тебя?

 
Nikolai Semko #:
Привет Петр. 
Вот, кстати, серьезный минус использование имен на русском. Это отсекает сразу более 90% нерусскоговорящих программистов. Ведь они видят какие-то квазилябры. Дублирование этой ветки на нескольких языках - это жесткое испытание, конечно, для нерусскоговорящих. 
Забегая вперед, можно задать тебе пару вопросов?
Ввиду того, что твой GUI создан без применения классов, сразу возникает несколько неопределенностей. 
Ведь, какие, в первую очередь, требования должны быть к GUI, как продукту?
Это удобство и интуитивность создания GUI, а так же удобное использование его в процессе работы.
В связи с этим:


Вопрос 1

Какой существует механизм для программиста обработки события со стороны твоего GUI?
Например, в моих GUI при создании элемента управления, я добавляю сразу указатель на функцию обработчик при наступления события изменения этого элемента.
Пример кода:



Вопрос 2

Как программисту получить доступ к состоянию конкретного элемента GUI?
Например, в моем GUI состояние checkbox (bool) я могу получить так:

но я использую классы, вложенные друг в друга.
А как это сделать у тебя?

Николай привет!

Отвечаю по порядку:


1. Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом. В этом нет необходимости. Далее ты поймешь почему. Пользователю нужен ТОЛЬКО язык разметки. (Я подчеркивал это несколько раз ранее, но всегда получаю этот повторяющийся вопрос от программистов. ) Причина в том, что пользователь лишь "инициализирует" массив с помощью ключевых слов языка, которые определенны дефайнами в коде конструктора. Интерпретатор (индикатор) посылает массив с кодом разметки (тот что я показал выше) в конструктор (который советник на том же графике) и конструктор читает массив и строит графический интерфейс. Код языка разметки есть инструкция для конструктора.  Он по ней выполняет построение (рисование, инициализацию параметров элементов, настройки и прочее.)


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

Поясню подробнее: пользователь подключает два файла полученных от конструктора и движок (который я предоставлю) к своему советнику (в шапке советника. Пример подключения предоставлю). Затем, пишет несколько вызовов в функциях OnInit(), OnTimer(), OnChartEvent() и OnDeinit() (пример предоставлю). Далее, заходит в файл напечатанный конструктором который называется Internal_API. В этом файле есть все необходимое для подключения элементов управления GUI к советнику/индикатору пользователя. То есть - генерированные функции элементов и подробные инструкции. Примеры подключения я предоставлю позже. 

Повторю, ничего сложного. Там все есть. Вот например как это выглядит с интерфейсом выше:

1. Написали окно.


 2. Далее по инструкции ниже:

3.

  • Переносим два напечатанных конструктором файла в свой проект. 
  • Подключаем к своему советнику. 
  • Прописываем вызывы нескольких функций как показано на картинке.


4. Открываем файл InternalAPI и начинаем подключение. В файле есть ВСЕ.

//---------------------------------------------------------------------------------------------------------------------------+
//                                              PLEASE READ CAREFULLY                                                        |
//---------------------------------------------------------------------------------------------------------------------------+
//-------------------------------------TO GET OR SET VALUE FOR YOUR VARIABLE-------------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//1. To initialize your variable with this value, type:            variable = ( type of your variable )value;                |
//2. To initialize your variable with some element's value, type:  variable = E_, then, choose element and add ();           |
//---------------------------------------------------------------------------------------------------------------------------+
//---------------------------------------TO GET OR SET VALUE OF THE ELEMENT--------------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//3. To use value of some element, type:                           E_, then, choose element and add ();                      |
//4. To set new value to some element, type:                       E_, then, choose element and add ( type here new value ); |
//---------------------------------------------------------------------------------------------------------------------------+
//-------------------------------------------TO OPEN OR CLOSE A WINDOW-------------------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//5. To open your window, type:                                    W_, then, choose window and add ();                       |
//6. To close your window, type:                                   W_, then, choose window and add (close);                  |
//---------------------------------------------------------------------------------------------------------------------------+
//------------------------------------TO CHANGE A COLOR PROPERTY OF THE ELEMENT----------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//7. To change main color of the element:                          Type E_,then, choose element and add (M_COLOR,your color);|
//8. To change text color of the element:                          Type E_,then, choose element and add (T_COLOR,your color);|
//9. To change frame color of the element:                         Type E_,then, choose element and add (F_COLOR,your color);|
//---------------------------------------------------------------------------------------------------------------------------+
//------------------------------------TO CHANGE READ ONLY PROPERTY OF THE TEXT BOX-------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//10.To change READ ONLY property of the text box:                 Type E_,then, choose element and add (ONLY_READ,0 or 1);  |
//---------------------------------------------------------------------------------------------------------------------------+
//------------------------------------TO CHANGE A STATE PROPERTY OF THE ELEMENT----------------------------------------------+
//---------------------------------------------------------------------------------------------------------------------------+
//11.You can set 6 possible states of the element:        OFF, ON, LOCKED_OFF, LOCKED_ON, OFF_H, ON_H.                       |
//To set a new state of the element:                    Type E_,then, choose element and add (STATE,one of the states above);|
//---------------------------------------------------------------------------------------------------------------------------+
//***************************************************************************************************************************+
//NOTICE: THE COLOR WILL BE SET FOR THE CURRENT STATE OF THE ELEMENT. IF THE STATE CHANGES, THE COLOR WILL CHANGE.           |
//        IN EACH STATE THE ELEMENT CAN HAVE DIFFERENT MAIN, TEXT AND FRAME COLOR. MAKE SURE TO CONSIDER THE STATE           |
//        OF THE ELEMENT, WHEN YOU CHANGE IT'S MAIN, TEXT OR FRAME COLOR.                                                    | 
//---------------------------------------------------------------------------------------------------------------------------+
string DRIVE_MESSAGE_ADRESS = "\Experts\Advisors\MY_VS.1.0.ex5";
//---------------------------------------------------------------------------------------------------------------------------+
//---------------------------------------- 
#define _open                13
#define _close               14
//---------------------------------------- 
#define on                   1
#define off                  0
//---------------------------------------- 
#define pressed              1
#define released             0
//---------------------------------------- 
#define checked              1
#define unchecked            0
//---------------------------------------- 
#define rare_value "~~`````~```~~~~~`~~~`~"
//---------------------------------------- 
int Params[10000];
//---------------------------------------- 
int par = 0;
//---------------------------------------- 
string i_MSG = NULL;
//---------------------------------------- 
uint Orders[];
//---------------------------------------- 
uint N = 0;
//---------------------------------------- 
#define Descending  -1
//========================================================================================================= 
#define CHECKBOX3___Some_checkbox_1               3
#define D_LIST4___Some_list_1               4
//========================================================================================================= 
void On_Gui_Event(int Element, string value, double Magic = 0)
{
 string action = value, selected_option = value; //DON'T CHANGE THIS LINE
//------------------------------------
 switch(Element)
   {
//=====================================================================================================================
//WINDOW:   Demo window 1 | element: CHECKBOX  | name: Some checkbox 1  |  Location: Window's Main Frame
//=====================================================================================================================
case CHECKBOX3___Some_checkbox_1:
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:     break;
  
                case unchecked:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:   Demo window 1 | element: D_LIST  | name: Some list 1  |  Location: Window's Main Frame
//=====================================================================================================================
case D_LIST4___Some_list_1:
               //------------------------------------------------------------------------------------------------------
               //What to do when option selected?
               //------------------------------------------------------------------------------------------------------
               if(selected_option == "L_ITEM  1"){}
               if(selected_option == "L_ITEM  2"){}
               if(selected_option == "L_ITEM  3"){}
               if(selected_option == "L_ITEM  4"){}
               if(selected_option == "L_ITEM  5"){}
               if(selected_option == "L_ITEM  6"){}
               if(selected_option == "L_ITEM  7"){}
               if(selected_option == "L_ITEM  8"){}
               if(selected_option == "L_ITEM  9"){}
               if(selected_option == "L_ITEM  10"){}
               if(selected_option == "L_ITEM  11"){}
               if(selected_option == "L_ITEM  12"){}
               if(selected_option == "L_ITEM  13"){}
               if(selected_option == "L_ITEM  14"){}
               if(selected_option == "L_ITEM  15"){}
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
   }
}
//=================================================================================================================
//----------------------------------------------------------------------------------------------------------------
string E_Demo_window_1_Some_checkbox_1(string n = rare_value,  int Property = -1){return(GET_N_SET(3,n,Property));}
//----------------------------------------------------------------------------------------------------------------
string E_Demo_window_1_Some_list_1(string n = rare_value,  int Property = -1){return(GET_N_SET(4,n,Property));}
//----------------------------------------------------------------------------------------------------------------
string E__(string n = rare_value,  int Property = -1){return(GET_N_SET(5,n,Property));}
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
void W_Main_context_menu(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "2" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "2" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Set_Values_Change_Delay(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "3" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "3" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_GEN_Disconnected(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "5" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "5" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Caption_of_GEN_Disconnected(string Caption)
{
 i_MSG += (string)W_CAPTION + "`" + Caption + "`" + "5" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Custom_Context_Menu(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "8" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "8" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Custom_Set_Values_Change_Delay(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "9" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "9" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Demo_window_1(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "10" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "10" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_Caption_of_Demo_window_1(string Caption)
{
 i_MSG += (string)W_CAPTION + "`" + Caption + "`" + "10" + "~";
}
//----------------------------------------------------------------------------------------------------------------
void W_(int action = _open)
{
 if(action == _open)i_MSG += (string)OPEN_WINDOW + "`" + "0" + "`" + "0" + "`" + "0" + "~";
 if(action == _close)i_MSG += (string)CLOSE_WINDOW + "`" + "0" + "`" + "0" + "`" + "0" + "~";
}
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
int C_Index(int Par){return((int)P_CORE[Par][_COLOMN_]*1000000 + (int)P_CORE[Par][_G_INDEX]);}
//----------------------------------------------------------------------------------------------------------------
//========================================================================================================= 
string GET_N_SET(int Element,  string n, int Property)
{
if(n != rare_value && Property == -1)
  {
   P_CORE[Element][_NEW_VALUE]  = n;
   P_CORE[Element][_LAST_VALUE] = P_CORE[Element][_CURRENT_VALUE];
   P_CORE[Element][_CURRENT_VALUE] = P_CORE[Element][_NEW_VALUE];
   if(n != P_CORE[Element][_LAST_VALUE])i_MSG += (string)_SYNC_P_CORE + "`" + P_CORE[Element][_ELEMENT] + "`" + "0" + "`" + P_CORE[Element][_CURRENT_VALUE] + "~";
   return(P_CORE[Element][_CURRENT_VALUE]);
  }
if(n == rare_value && Property == -1)return(P_CORE[Element][_CURRENT_VALUE]);
if((int)n > 12 && (int)n < 18 && Property > -1)
  {
   if(Property == OFF || Property == OFF_H || Property == LOCKED_OFF)On_Gui_Event(Element,(string)0);
   if(Property == ON  || Property == ON_H  || Property == LOCKED_ON) On_Gui_Event(Element,(string)1);
   if(n != P_CORE[Element][_LAST_VALUE])i_MSG += n + "`" + P_CORE[Element][_ELEMENT] + "`" + "0" + "`" + (string)Property + "~";
  }
return(NULL);
}
//========================================================================================================= 



Пользователь должен только прописать свои действия в условиях функции OnGuiEvent().  Остальное трогать НЕ НУЖНО. 


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

 

Из кода файла выше пользователь работает только с этой частью:


 
Реter Konow #:

Николай привет!

Отвечаю по порядку:


1. Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом. В этом нет необходимости. Далее ты поймешь почему. Пользователю нужен ТОЛЬКО язык разметки. (Я подчеркивал это несколько раз ранее, но всегда получаю этот повторяющийся вопрос от программистов. ) Причина в том, что пользователь лишь "инициализирует" массив с помощью ключевых слов языка, которые определенны дефайнами в коде конструктора. Интерпретатор (индикатор) посылает массив с кодом разметки (тот что я показал выше) в конструктор (который советник на том же графике) и конструктор читает массив и строит графический интерфейс. Код языка разметки есть инструкция для конструктора.  Он по ней выполняет построение (рисование, инициализацию параметров элементов, настройки и прочее.)


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

Поясню подробнее: пользователь подключает два файла полученных от конструктора и движок (который я предоставлю) к своему советнику (в шапке советника. Пример подключения предоставлю). Затем, пишет несколько вызовов в функциях OnInit(), OnTimer(), OnChartEvent() и OnDeinit() (пример предоставлю). Далее, заходит в файл напечатанный конструктором который называется Internal_API. В этом файле есть все необходимое для подключения элементов управления GUI к советнику/индикатору пользователя. То есть - генерированные функции элементов и подробные инструкции. Примеры подключения я предоставлю позже. 

Повторю, ничего сложного. Там все есть. Вот например как это выглядит с интерфейсом выше:

1. Написали окно.


 2. Далее по инструкции ниже:

3.

  • Переносим два напечатанных конструктором файла в свой проект. 
  • Подключаем к своему советнику. 
  • Прописываем вызывы нескольких функций как показано на картинке.


4. Открываем файл InternalAPI и начинаем подключение. В файле есть ВСЕ.



Пользователь должен только прописать свои действия в условиях функции OnGuiEvent().  Остальное трогать НЕ НУЖНО. 


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

Петр, я тебя не понял. Ты не ответил на вопросы.
Для программистов важно узнать, как взаимодействовать с твоим GUI в процессе работы. 
Вот пример моего GUI. Я нажал ярлык светлой/темной темы, и это событие сразу вызвало функцию смены цветов фона и линий. Как это взаимодейстие сделать у тебя?


Что значит " Пользователь НЕ БУДЕТ (от слова совсем) взаимодействовать с моим кодом.  "?
Программисту нужно взаимодействовать, правда не с кодом, а с событиями, который должен генерировать этот код.

Ведь GUI - это не отдельная независимая программа. GUI должен в конечном итоге взаимодействовать с основной программой разработчика. Будь то индикатор или EA.