//+------------------------------------------------------------------+//| Язык разметки 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, //(Писать ОБЯЗАТЕЛЬНО)
简单代码示例
任何事情一旦开始就必须完成。即使没有人需要它。这就是原则。
你需要如果界面不仅能被画出来 还能被使用的话我希望如此。
需要。如果界面不仅能画出来,还能用起来。希望如此。
当然可以。这就是我正在努力的方向。
当然,对于不懂俄语的人来说,用多种语言复制这个分支是一个严峻的考验。 展望未来,我可以问您几个问题吗? 由于您的图形用户界面是在没有使用类的情况下创建的,因此一下子就出现了几个不确定因素。 毕竟,对图形用户界面这个产品的要求首先是什么? 是创建图形用户界面的方便性和直观性,以及在工作过程中使用的方便性。 在这方面:
问题 1
程序员有什么机制来处理 GUI 中的事件处理? 例如,在我的 GUI 中,当创建一个控件时,我会在该控件 上发生变化事件时添加一个指向处理函数的指针。 示例代码:
问题 2
程序员如何访问特定图形用户界面元素的状态? 例如,在我的图形用户界面中,我可以像这样获取复选框(bool)的状态: .
但我使用的是嵌套类,您是如何做到的?
问题 2
程序员如何访问特定图形用户界面元素的状态? 例如,在我的图形用户界面中,我可以这样获取复选框(bool)的状态:但我使用了嵌套类。 你是如何做到的?
尼古拉斯 你好!
我将按以下顺序回答:
1.用户不会(从字面上看)与我的代码进行交互。 这是没有必要的。 你会明白为什么。 用户只需要标记语言.(我以前多次强调过这一点,但程序员总是反复问我这个问题)。原因是用户只需使用构造函数代码中定义的语言关键字来 "初始化 "数组。解释器(指标)向构造器(即同一图表上的 EA)发送带有标记代码(我上面展示的那个)的数组,构造器读取数组并构建图形用户界面。 标记语言代码是构造器的指令。 构造器将根据它执行构造(绘制、元素参数初始化、设置等)。
2.该机制非常简单。完成界面编辑后,用户双击图表调用构造器的上下文菜单,并选择保存选项。构造函数会将所有信息打印到两个文件中。引擎将使用这些文件。
让我来详细解释一下:用户将从构造器和引擎(我将提供)收到的两个文件连接到他的 EA(在 EA 的标题中,我将提供一个连接示例)。然后,在函数 OnInit()、OnTimer()、OnChartEvent() 和 OnDeinit() 中写入几个调用(我将提供一个示例)。接下来,将进入一个由构造函数打印的名为 Internal_API 的文件。该文件包含将图形用户界面控件连接到智能交易系统/用户指标所需的所有内容。即:生成的元素函数和详细说明。稍后我将提供连接示例。
再说一遍,这并不复杂。一切都在这里。下面是上述界面的示例:
1.写一个窗口。
2.按照下面的说明操作:
3.
打开 InternalAPI 文件并启动连接。该文件包含所有内容。
用户只需在 OnGuiEvent() 函数的条件中写入自己的操作即可。 其余部分无需涉及。
切换控件状态以及获取/设置控件值都是通过构造函数生成的函数完成的,用户可以在 intellisense 中看到这些函数。
从上面的文件代码来看,用户只需处理这一部分:
尼古拉斯,你好
我会按顺序回答:
1.用户不会(从字面上看)与我的代码交互。 这是没有必要的。 接下来你就会明白为什么了。 用户只需要标记语言.(我以前多次强调过这一点,但程序员们总是反复问我这个问题)。原因是用户只需使用构造函数代码中定义的语言关键字来 "初始化 "数组。解释器(指标)向构造器(即同一图表上的 EA)发送带有标记代码(我上面展示的那个)的数组,构造器读取数组并构建图形用户界面。 标记语言代码是构造器的指令。 构造器将根据它执行构造(绘制、元素参数初始化、设置等)。
2.该机制非常简单。完成界面编辑后,用户双击图表,调用构造器的上下文菜单,并选择保存选项。构造函数会将所有信息打印到两个文件中。引擎将使用这些文件。
让我来详细解释一下:用户将从构造器和引擎(我将提供)收到的两个文件连接到他的 EA(在 EA 的标题中,我将提供一个连接示例)。然后,在函数 OnInit()、OnTimer()、OnChartEvent() 和 OnDeinit() 中写入几个调用(我将提供一个示例)。接下来,将进入一个由构造函数打印的名为 Internal_API 的文件。该文件包含将图形用户界面控件连接到智能交易系统/用户指标所需的所有内容。即:生成的元素函数和详细说明。稍后我将提供连接示例。
再说一遍,这并不复杂。一切都在这里。下面是上述界面的示例:
1.我们编写了一个窗口。
2.按照下面的说明操作:
3.
打开 InternalAPI 文件并启动连接。该文件包含所有内容。
用户只需在 OnGuiEvent() 函数的条件中指定自己的操作即可。 其余部分无需修改。
切换控件状态和获取/设置控件值都是通过构造函数生成的函数完成的,用户可以在 intellisense 中看到这些函数。
彼得,我不明白你的意思。
对于程序员来说,知道如何在工作时与图形用户界面交互是很重要的。 下面是我的图形用户界面示例。我点击了明暗主题快捷键,这个事件立即触发了改变背景颜色和线条的功能。如何进行这种交互?
用户不会与我的代码交互(根本不会)"是什么意思 ? 程序员需要交互的不是代码,而是应该生成代码的事件。 毕竟,图形用户界面不是一个独立的程序。图形用户界面最终必须与开发人员的主程序互动。无论是指标还是 EA。