Обсуждение статьи "Как быстро добавить панель управления к индикатору и советнику" - страница 2

 

Для истории:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Почему съезжает панель при обновлении настроек эксперта?

Andrey Khatimlianskii, 2016.03.10 13:17

Примерно так:

// ПЕРЕД подключением Dialog.mqh!
#include <Controls\Defines.mqh>

//--- Забываем старые цвета
#undef  CONTROLS_DIALOG_COLOR_BORDER_LIGHT
#undef  CONTROLS_DIALOG_COLOR_BORDER_DARK
#undef  CONTROLS_DIALOG_COLOR_BG
#undef  CONTROLS_DIALOG_COLOR_CAPTION_TEXT
#undef  CONTROLS_DIALOG_COLOR_CLIENT_BG
#undef  CONTROLS_DIALOG_COLOR_CLIENT_BORDER

//--- Устанавливаем новые цвета
#define CONTROLS_DIALOG_COLOR_BORDER_LIGHT  clrWhite            // Dialog border color (outside)
#define CONTROLS_DIALOG_COLOR_BORDER_DARK   C'0xB6,0xB6,0xB6'   // Dialog border color (inside)
#define CONTROLS_DIALOG_COLOR_BG            clrLightGreen       // Dialog background (under the caption and around the client area)
#define CONTROLS_DIALOG_COLOR_CAPTION_TEXT  C'0x28,0x29,0x3B'   // Dialog caption text color
#define CONTROLS_DIALOG_COLOR_CLIENT_BG     clrAliceBlue        // Client area background color
#define CONTROLS_DIALOG_COLOR_CLIENT_BORDER C'0xC8,0xC8,0xC8'   // Client area color

// Теперь подключаем
#include <Controls\Dialog.mqh>

 

А можете привести простой пример как надо CWndContainer переиначить, чтобы он хоть какой-то квадратик на экран чат вывел по .Show()?

Я всяко пробовал, например, вот так, но ни ошибок ни изображения ни признаков работы по .Show()

#include <Controls\WndContainer.mqh>

class MyWndContainer : public CWndContainer  {
   public:
      MyWndContainer(string name);
};

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
MyWndContainer::MyWndContainer(string name) {
   m_chart_id = ChartID();
   m_subwin = 0;
   m_name = name;
                   m_id = 0;
                   m_align_top = 5;
                   m_align_right = 5;
                   m_align_left = 5;
                   m_align_bottom = 5;
                   m_mouse_x = 100;
                   m_mouse_y = 100;
                   m_align_flags = ALIGN_CENTER;
                   m_prop_flags = PROGRAM_EXPERT;
                   m_mouse_flags = MOUSE_EMPTY;
} 
 
Evgeny Potapov:

А можете привести простой пример как надо CWndContainer переиначить, чтобы он хоть какой-то квадратик на экран чат вывел по .Show()?

Я всяко пробовал, например, вот так, но ни ошибок ни изображения ни признаков работы по .Show()

Зачем именно CWndContainer? Что в итоге должно получится?
 

Во здесь я не улавливаю логики:

//+------------------------------------------------------------------+
//| Makes the group of controls visible                              |
//+------------------------------------------------------------------+
bool CWndContainer::Show(void)
  {
//--- loop by elements of group
   int total=m_controls.Total();
   for(int i=0;i<total;i++)
     {
      CWnd *control=Control(i);
      //--- check of pointer
      if(control==NULL)
         continue;
      control.Show();
     }
//--- call of the method of the parent class
   return(CWnd::Show());
  }

А если у меня объект Button, в нём нет метода .Show().

Он получается не может содержаться к контейнере?

 
Karputov Vladimir:
Зачем именно CWndContainer? Что в итоге должно получится?
Панель с кнопками Buy - Sell и ещё некотороми оповещениями о состоянии советника. Но она должна перетаскиваться по экрану мышкой, а кнопка не перетаскивается.
 
Evgeny Potapov:
Панель с кнопками Buy - Sell и ещё некотороми оповещениями о состоянии советника. Но она должна перетаскиваться по экрану мышкой, а кнопка не перетаскивается.
После создания объекта (кнопка, список, текстовое поле и тому подобное) этот объект нудно добавить в панель (метод Add). Тогда при перетаскивании панельки вместе с панелькой будут перемещаться и все объекты.
 
Karputov Vladimir:
После создания объекта (кнопка, список, текстовое поле и тому подобное) этот объект нудно добавить в панель (метод Add). Тогда при перетаскивании панельки вместе с панелькой будут перемещаться и все объекты.

Вот так?

#include <Controls\Button.mqh>
#include <MyControls\MyWndContainer.mqh>

CButton *MyButton;
CWndContainer  *MyContainer;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()  {
   MyButton = new CButton;
   if(CheckPointer(MyButton) == POINTER_INVALID) return(INIT_FAILED);
   MyButton.Create(ChartID(),WindowExpertName()+"_button",0,50,100,150,250);

   MyContainer = new MyWndContainer("MyContainer");
   if(CheckPointer(MyContainer) == POINTER_INVALID) return(INIT_FAILED);
   MyContainer.Add(MyButton);
   MyContainer.Show();
   MyContainer.Enable();

   
   return(INIT_SUCCEEDED);
}
 
Karputov Vladimir:
После создания объекта (кнопка, список, текстовое поле и тому подобное) этот объект нудно добавить в панель (метод Add). Тогда при перетаскивании панельки вместе с панелькой будут перемещаться и все объекты.

Или это не "добавление в панель"?

То есть контейнер - это не панель?

 
Evgeny Potapov:

Или это не "добавление в панель"?

То есть контейнер - это не панель?

На примере файла PanelDialog2.mqh из статьи:

//+------------------------------------------------------------------+
//|                                                 PanelDialog2.mqh |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\CheckGroup.mqh>
#include <Controls\Label.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT                         (11)      // indent from left (with allowance for border width)
#define INDENT_TOP                          (11)      // indent from top (with allowance for border width)
#define INDENT_RIGHT                        (11)      // indent from right (with allowance for border width)
#define INDENT_BOTTOM     

Этот файл создаёт элементы для панели диалогов. Признак панели - это класс CDialog.

Класс CDialog

Класс CDialog является классом комбинированного элемента управления "Диалог".

Описание

Класс CDialog предназначен для визуального объединения группы функционально связанных разнородных элементов.

 
Karputov Vladimir:

На примере файла PanelDialog2.mqh из статьи:

Этот файл создаёт элементы для панели диалогов. Признак панели - это класс CDialog.

Спасибо!

Сейчас с CDialog попробую, но я всё равно не понял как это должно работать: ведь кнопка становится видна сразу после создания, она что, должна исчезнуть и перепрыгнуть в CDialog?