Controls панель. "Разъезжаются внутренности" панели при минимизации/максимизации

 

Хочу создать панель, точнее это получилось, проблем тут нет.  (не обращайте внимания на кнопки на заднем плане, они не с этой "оперы"). 

Чувствую что что-то просто не учла... 

Вот, появились 2 проблемы: 

1) при минимизации она "прыгает" в другое место

2) при максимизации обратно - разъезжаются внутренности... 

С того что перегружено:

//+------------------------------------------------------------------+
//| Class Scenario  PANEL                                            |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog{
   private:
      CButton    m_butt_rec;                       
      CButton    m_butt_refr;                   
      CButton    m_butt_go;                    
      CListView  m_list_view;                     
   public:
      virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
      virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   protected:
      bool           CreateButtonRec (int x1, int y1, int x2, int y2);
      bool           CreateButtonRefr(int x1, int y1, int x2, int y2);
      bool           CreateButtonGo  (int x1, int y1, int x2, int y2);
      bool           CreateListView  (int x1, int y1, int x2, int y2);
      void           OnClickButton1(void);
      void           OnClickButton2(void);
      void           OnClickButton3(void);};
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CPanelDialog)
ON_EVENT(ON_CLICK,m_butt_rec,OnClickButton1)
ON_EVENT(ON_CLICK,m_butt_refr,OnClickButton2)
ON_EVENT(ON_CLICK,m_butt_go,OnClickButton3)
ON_OTHER_EVENTS(OnDefault)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool CPanelDialog::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);
   int by1 = 0;
   int bx1 = 0; 
   int bh  = 15;
   int bw  = (int)MathFloor(ClientAreaWidth()/3)-by1*2;
   int lx2 = bw*3; 
   int ly2 = ClientAreaHeight()-by1; 
   
   if(!CreateButtonRec  (bx1+bw*0, by1,    bx1+bw*1,  by1+  bh))  return(false);
   if(!CreateButtonRefr (bx1+bw*1, by1,    bx1+bw*2,  by1+  bh))  return(false);
   if(!CreateButtonGo   (bx1+bw*2, by1,    bx1+bw*3,  by1+  bh))  return(false);
   if(!CreateListView   (bx1+bw*0, by1+bh, bx1+bw*3,  ly2     ))  return(false);
   return(true);}
//+------------------------------------------------------------------+
bool CPanelDialog::CreateButtonRec(int x1, int y1, int x2, int y2){
   if(!this.m_butt_rec.Create(m_chart_id,m_name+"_Rec",m_subwin, x1, y1, x2, y2)) return(false);
   if(!m_butt_rec.Text("Rec")) return(false);
   if(!Add(m_butt_rec))return(false);
   m_butt_rec.Alignment(WND_ALIGN_RIGHT,0,0,0,0);
   return(true);}
bool CPanelDialog::CreateButtonRefr(int x1, int y1, int x2, int y2){
   if(!this.m_butt_refr.Create(m_chart_id,m_name+"_Refr",m_subwin, x1, y1, x2, y2)) return(false);
   if(!m_butt_refr.Text("Refr")) return(false);
   if(!Add(m_butt_refr))return(false);
   m_butt_refr.Alignment(WND_ALIGN_RIGHT,0,0,0,0);
   return(true);}
bool CPanelDialog::CreateButtonGo(int x1, int y1, int x2, int y2){
   if(!this.m_butt_go.Create(m_chart_id,m_name+"_Go",m_subwin, x1, y1, x2, y2)) return(false); 
   if(!m_butt_go.Text("Go")) return(false);
   if(!Add(m_butt_go))return(false);
   m_butt_go.Alignment(WND_ALIGN_RIGHT,0,0,0,0);
   return(true);}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool CPanelDialog::CreateListView(int x1, int y1, int x2, int y2){
   if(!m_list_view.Create(m_chart_id,m_name+"ListView",m_subwin,x1,y1,x2,y2)) return(false);
   if(!Add(m_list_view)) return(false);
   m_list_view.Alignment(WND_ALIGN_HEIGHT,0,0,0,0);
   
   for(int i=0;i<16;i++)  if(!m_list_view.ItemAdd("Item "+IntegerToString(i))) return(false);
   
   return(true);}

//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CPanelDialog::OnClickButton1(void){ Alert(__FUNCTION__); }
void CPanelDialog::OnClickButton2(void){ Alert(__FUNCTION__); }
void CPanelDialog::OnClickButton3(void){ Alert(__FUNCTION__); }


 

  1. Код, пожалуйста вставляйте правильно: Правильно вставляем код на форуме
  2. Всё таки нужен полный код, возможно забыли вставить в главный файл советника эти функции:

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy dialog
   ExtDialog.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| 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);
  }

(пример кода из [data folder]\MQL5\Experts\Examples\Controls\Controls.mq5)

 

1) в чем моя ошибка вставки кода

2) все функции что описали - есть, именно по примеру и делала. Разница в том что пример в отдельном окне индикатора, а мне нужно на главном окне графика. 

 

Сделала тестовую версию, удалила все лишнее чтоб прикрепить файл. 

Всеравно все разъезжается. Не могу сделать в отдельном окне, как в примере, т.к. это советник. Мне нужны Слипы, а в индикаторах это не работает. 

Файлы:
 

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

 
Vasiliy Pushkaryov:

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


ОГРОМНОЕ СПАСИБО! Помогло

Осталась только первая проблема, чтоб окно не перескакивало при минимизации, но это юзер может и пережить

 
Galina Bobro:

ОГРОМНОЕ СПАСИБО! Помогло

Осталась только первая проблема, чтоб окно не перескакивало при минимизации, но это юзер может и пережить


Переопределите метод Minimize(), добавив в него дополнительно метод ExtDialog.Move() с координатами, которые Вам нужны при минимизации.

 
Vasiliy Pushkaryov:

Переопределите метод Minimize(), добавив в него дополнительно метод ExtDialog.Move() с координатами, которые Вам нужны при минимизации.


Cпасибо, работает

-----

Если вдруг кому-то нужно - прикрепляю рабочий пример

Файлы:
Причина обращения: