Панели и диалоги. Можно задавать цвет, шрифт ... - страница 3

 
Andrey Khatimlianskii:

И это работает при изменении значения через окно входных параметров??

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

Если нужно, чтобы форма реагировала на смену входных параметров - нужно каждый раз убивать и создавать форму заново.


ControlsBmpButton.mq5
version   "1.002"


***
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CControlsDialog *ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(CheckPointer(ExtDialog)==POINTER_INVALID) //--- step 1
     {
      ExtDialog=new CControlsDialog;
      if(CheckPointer(ExtDialog)==POINTER_INVALID)
         return(INIT_FAILED);
     }
   else //--- step 2
     {
      delete ExtDialog;
      ExtDialog=new CControlsDialog;
      if(CheckPointer(ExtDialog)==POINTER_INVALID)
         return(INIT_FAILED);
     }
//--- create application dialog
   if(!ExtDialog.Create(0,"Controls",0,40,40,380,344))
      return(INIT_FAILED);
//--- run application
   ExtDialog.Run();
//--- succeed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 
   Comment("");
//--- destroy dialog
   ExtDialog.Destroy(reason);
   if(CheckPointer(ExtDialog)!=POINTER_INVALID)
      delete ExtDialog;
  }
***
Файлы:
 
Vladimir Karputov:

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

Если нужно, чтобы форма реагировала на смену входных параметров - нужно каждый раз убивать и создавать форму заново.


ControlsBmpButton.mq5
version   "1.002"


Кстати, если создавать панель на базе CAppDialog в индикаторе, то undef, затем входной параметр и define позволяет применять изменения без принудительного пересоздания панели:

//+------------------------------------------------------------------+
//|                                  ControlsBmpButton INDICATOR.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property indicator_chart_window
#property indicator_plots 0
#property description "Control Panels and Dialogs. Demonstration class CBmpButton"
#include <Controls\Defines.mqh>
#undef CONTROLS_FONT_NAME 
#undef CONTROLS_FONT_SIZE 

#undef CONTROLS_BUTTON_COLOR
#undef CONTROLS_BUTTON_COLOR_BG
#undef CONTROLS_BUTTON_COLOR_BORDER

#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 

input string   font_name                  = "Trebuchet MS";
input int      font_size                  = 10;

input color    button_color               = C'0x3B,0x29,0x28';
input color    button_color_bg            = C'0xDD,0xE2,0xEB';
input color    button_color_border        = C'0xB2,0xC3,0xCF';

input color    dialog_color_border_light  = White;
input color    dialog_color_border_dark   = C'0xB6,0xB6,0xB6';
input color    dialog_color_bg            = C'0xF0,0xF0,0xF0';
input color    dialog_color_caption_text  = C'0x28,0x29,0x3B';
input color    dialog_color_client_bg     = C'0xF7,0xF7,0xF7';
input color    dialog_color_client_border = C'0xC8,0xC8,0xC8';

#define CONTROLS_FONT_NAME                font_name
#define CONTROLS_FONT_SIZE                font_size

#define CONTROLS_BUTTON_COLOR             button_color
#define CONTROLS_BUTTON_COLOR_BG          button_color_bg
#define CONTROLS_BUTTON_COLOR_BORDER      button_color_border

#define CONTROLS_DIALOG_COLOR_BORDER_LIGHT dialog_color_border_light
#define CONTROLS_DIALOG_COLOR_BORDER_DARK dialog_color_border_dark
#define CONTROLS_DIALOG_COLOR_BG          dialog_color_bg
#define CONTROLS_DIALOG_COLOR_CAPTION_TEXT dialog_color_caption_text
#define CONTROLS_DIALOG_COLOR_CLIENT_BG   dialog_color_client_bg
#define CONTROLS_DIALOG_COLOR_CLIENT_BORDER dialog_color_client_border

#include <Controls\Dialog.mqh>
#include <Controls\BmpButton.mqh>
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+

а всё потому, что при смене входных параметров индикаторы загружаются заново. Справка Выполение программ

Загрузка и выгрузка индикаторов

Индикаторы загружаются в следующих случаях:

  • прикрепление индикатора к графику;
  • запуск терминала (если индикатор был прикреплен к графику перед предыдущим закрытием терминала);
  • загрузка шаблона (если в шаблоне указан прикрепленный к графику индикатор);
  • смена профиля (если индикатор прикреплен к одному из графиков профиля);
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • после удачной перекомпиляции индикатора, если данный индикатор был прикреплен к графику.
  • изменение входных параметров индикатора.



Индикатор

ControlsBmpButton INDICATOR.mq5 |
version   "1.000"

Файлы:
 

Цвет, шрифт ... это понятно.

Вопрос от чайника. Если правильно понимаю по дефолту панель имеет привязку к левому верхнему углу активного графика. Хотелось бы привязать к правому нижнему. Надеялся что есть что-то типа ENUM_BASE_CORNER CORNER_RIGHT_LOWER как для объектов. Такой возможности не нашел. Тогда сделал привязку через координаты правого нижнего угла. Вот так.

#property strict
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {

   int pos_right =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  
   int pos_bottom=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);  
   int width=340;
   int height=80;

//--- create application dialog
   if(!ExtDialog.Create(0,"Close Buttons",0,pos_right-width,pos_bottom-height,pos_right,pos_bottom))
      return(INIT_FAILED);
//--- run application
   ExtDialog.Run();
//--- succeed

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {

//--- clear comments
   Comment("");
//--- destroy dialog
   ExtDialog.Destroy(reason);

}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {

}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                               ControlsButton.mq5 |
//+------------------------------------------------------------------+
//--- 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                       (11)      // indent from bottom (with allowance for border width)
#define CONTROLS_GAP_X                      (5)       // gap by X coordinate
#define CONTROLS_GAP_Y                      (5)       // gap by Y coordinate
//--- for buttons
#define BUTTON_WIDTH                        (100)     // size by X coordinate
#define BUTTON_HEIGHT                       (20)      // size by Y coordinate
//--- for the indication area
#define EDIT_HEIGHT                         (0)       // size by Y coordinate
//+------------------------------------------------------------------+
//| Class CControlsDialog                                            |
//| Usage: main dialog of the Controls application                   |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
  {
private:
   CButton           m_button1;                       // the button object

public:
                     CControlsDialog(void);
                    ~CControlsDialog(void);
   //--- create
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- chart event handler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
 
protected:
   //--- create dependent controls
   bool              CreateButton1(void);
   //--- handlers of the dependent controls events
   void              OnClickButton1(void);
  };
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CControlsDialog)
ON_EVENT(ON_CLICK,m_button1,OnClickButton1)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CControlsDialog::CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CControlsDialog::~CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- create dependent controls
   if(!CreateButton1())
      return(false);
//--- succeed
   return(true);
  }
  
//+------------------------------------------------------------------+
//| Create the "Cl-Buy" button                                       |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButton1(void)
  {
//--- coordinates
   int x1=INDENT_RIGHT;
   int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y);
   int x2=x1+BUTTON_WIDTH;
   int y2=y1+BUTTON_HEIGHT;
//--- create
   m_button1.ColorBackground(clrLime);
   if(!m_button1.Create(m_chart_id,m_name+"Cl-Buy",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_button1.Text("Cl-Buy"))
      return(false);
   if(!Add(m_button1))
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton1(void)
  {
   Comment("Button Buy was pressed.");
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CControlsDialog ExtDialog;

//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
   
  }
//+------------------------------------------------------------------+


Работает. Панель переместилась в правый нижний угол. Но проблема в том что если уменьшаю размеры окна активного графика, то панель уходит за его пределы.

Подскажите пожалуйста:

  1. Есть ли возможность более простой привязки правому нижнему или любому другому кроме дефолтного углу графика без вычисления его координат?
  2. Как сделать чтобы панель сохраняла привязку и не уходила за пределы графика при его сжатии?
Спасибо.
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Графические объекты Text, Label, Bitmap и Bitmap Label (OBJ_TEXT, OBJ_LABEL, OBJ_BITMAP и OBJ_BITMAP_LABEL) могут иметь один из 9 различных способов привязки своих координат, задаваемых свойством OBJPROP_ANCHOR. – объекты имеет ширину и высоту. Если указано "только для чтения", то это означает, что значения ширины и высоты...
 
Grigori.S.B:

Цвет, шрифт ... это понятно.

Вопрос от чайника. Если правильно понимаю по дефолту панель имеет привязку к левому верхнему углу активного графика. Хотелось бы привязать к правому нижнему. Надеялся что есть что-то типа ENUM_BASE_CORNER CORNER_RIGHT_LOWER как для объектов. Такой возможности не нашел. Тогда сделал привязку через координаты правого нижнего угла. Вот так.

Работает. Панель переместилась в правый нижний угол. Но проблема в том что если уменьшаю размеры окна активного графика, то панель уходит за его пределы.

Подскажите пожалуйста:

  1. Есть ли возможность более простой привязки правому нижнему или любому другому кроме дефолтного углу графика без вычисления его координат?
  2. Как сделать чтобы панель сохраняла привязку и не уходила за пределы графика при его сжатии?
Спасибо.
Пересчитывайте координаты в OnChartEvent()
 
Artyom Trishkin:
Пересчитывайте координаты в OnChartEvent()

Спасибо за оперативный ответ. Сделал вот так, но к желаемому результату не привело. Подскажите пожалуйста в чем ошибка.

#property strict
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>

   int pos_right;  
   int pos_bottom;  
   int Width;
   int Height;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {

   pos_right =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  
   pos_bottom=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);  
   Width=340;
   Height=80;

//--- create application dialog
   if(!ExtDialog.Create(0,"Close Buttons",0,pos_right-Width,pos_bottom-Height,pos_right,pos_bottom))
      return(INIT_FAILED);
//--- run application
   ExtDialog.Run();
//--- succeed

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {

//--- clear comments
   Comment("");
//--- destroy dialog
   ExtDialog.Destroy(reason);

}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {

}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                               ControlsButton.mq5 |
//+------------------------------------------------------------------+
//--- 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                       (11)      // indent from bottom (with allowance for border width)
#define CONTROLS_GAP_X                      (5)       // gap by X coordinate
#define CONTROLS_GAP_Y                      (5)       // gap by Y coordinate
//--- for buttons
#define BUTTON_WIDTH                        (100)     // size by X coordinate
#define BUTTON_HEIGHT                       (20)      // size by Y coordinate
//--- for the indication area
#define EDIT_HEIGHT                         (0)       // size by Y coordinate
//+------------------------------------------------------------------+
//| Class CControlsDialog                                            |
//| Usage: main dialog of the Controls application                   |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
  {
private:
   CButton           m_button1;                       // the button object
 
public:
                     CControlsDialog(void);
                    ~CControlsDialog(void);
   //--- create
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- chart event handler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
 
protected:
   //--- create dependent controls
   bool              CreateButton1(void);
   //--- handlers of the dependent controls events
   void              OnClickButton1(void);
  };
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CControlsDialog)
ON_EVENT(ON_CLICK,m_button1,OnClickButton1)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CControlsDialog::CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CControlsDialog::~CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- create dependent controls
   if(!CreateButton1())
      return(false);
//--- succeed
   return(true);
  }
  
//+------------------------------------------------------------------+
//| Create the "Cl-Buy" button                                       |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButton1(void)
  {
//--- coordinates
   int x1=INDENT_RIGHT;
   int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y);
   int x2=x1+BUTTON_WIDTH;
   int y2=y1+BUTTON_HEIGHT;
//--- create
   m_button1.ColorBackground(clrLime);
   if(!m_button1.Create(m_chart_id,m_name+"Cl-Buy",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_button1.Text("Cl-Buy"))
      return(false);
   if(!Add(m_button1))
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton1(void)
  {
   Comment("Button Buy was pressed.");
  }
//+------------------------------------------------------------------+

CControlsDialog ExtDialog;

//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
   pos_right =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  
   pos_bottom=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);  
   ChartRedraw();
  }
//+------------------------------------------------------------------+


 
Grigori.S.B:

Спасибо за оперативный ответ. Сделал вот так, но к желаемому результату не привело. Подскажите пожалуйста в чем ошибка.

Координаты пересчитывать нужно когда id==CHARTEVENT_CHART_CHANGE.

А вот куда их записывать в панели - тут не подскажу - не работал никогда со стандартными. Мне проще со своими.

 
Grigori.S.B:

Спасибо за оперативный ответ. Сделал вот так, но к желаемому результату не привело. Подскажите пожалуйста в чем ошибка.

Попробуйте в такой последовательности (в подробности реализации переменных не вникал)

//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   if(id == CHARTEVENT_CHART_CHANGE) 
     {
      pos_right =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  
      pos_bottom=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0); 
     } 
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

Координаты пересчитывать нужно когда id==CHARTEVENT_CHART_CHANGE.

А вот куда их записывать в панели - тут не подскажу - не работал никогда со стандартными. Мне проще со своими.

Valeriy Korobeynik:

Попробуйте в такой последовательности (в подробности реализации переменных не вникал)

Спасибо. Все попробовал, но проблему решить таким способом не удалось.

Панель по-прежнему уходит за пределы окна при уменьшении его размеров. Вот так.


 
Grigori.S.B:

Спасибо. Все попробовал, но проблему решить таким способом не удалось.

Панель по-прежнему уходит за пределы окна при уменьшении его размеров. Вот так.


Там есть метод Move()

Вот так должно работать.

//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
   pos_right =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  
   pos_bottom=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);  
   
   Width=340;
   Height=80;

   ExtDialog.Move(pos_right-Width,pos_bottom-Height);
   ChartRedraw();
  }
 
Vasiliy Pushkaryov:

Там есть метод Move()

Вот так должно работать.

ОГРОМНОЕ СПАСИБО тебе, добрый и умный человек!!!

Работает отлично. Как-то я упустил метод Move().