Обсуждение статьи "Как создать графическую панель любой сложности и как это работает" - страница 12

 
Vladimir Karputov #:

Это запрещено. Панель связана с диаграммой.

Большое спасибо. Понятно.

Могу я задать еще один вопрос, пожалуйста.

Я хочу создать панель для отображения некоторой таблицы, например, такой






















Но я могу найти только элемент управления ниже, значит ли это, что панель не может поддерживать создание таблицы, спасибо.

CLabel

Элемент управления, основанный на графическом объекте "Текстовая метка"

CBmpButton

Элемент управления, основанный на графическом объекте "Растровая метка"

CButton

Элемент управления, основанный на графическом объекте "Кнопка"

CEdit

Элемент управления, основанный на графическом объекте "Поле редактирования"

CPanel

Элемент управления, основанный на графическом объекте "Прямоугольная панель"

CPicture

Элемент управления, основанный на ярлыке "Bitmap label"

Documentation on MQL5: Standard Library / Panels and Dialogs / CEdit
Documentation on MQL5: Standard Library / Panels and Dialogs / CEdit
  • www.mql5.com
CEdit - Panels and Dialogs - Standard Library - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Quan tum # :

Большое спасибо. Я вижу.

Могу я задать еще один вопрос, пожалуйста.

Я хочу создать панель, на которой будет отображаться таблица следующего вида






















Но я могу найти только элемент управления ниже, значит ли это, что панель не может поддерживать создание таблицы, спасибо.

CLabel

Элемент управления, основанный на графическом объекте "Текстовая метка"

CBmpButton

Элемент управления, основанный на графическом объекте "Растровая метка"

CButton

Элемент управления, основанный на графическом объекте "Кнопка"

CEdit

Элемент управления, основанный на графическом объекте "Поле редактирования"

CPanel

Элемент управления, основанный на графическом объекте "Прямоугольная панель"

CPicture

Элемент управления, основанный на ярлыке "Bitmap label"

Вы должны сами создать таблицу. Поищите примеры в статьях и CodeBase.

 
Vladimir Karputov #:

Вам нужно создать таблицу самостоятельно. Поищите примеры в статьях и CodeBase.

Хорошо, спасибо большое. Я так и думаю.

Я постараюсь найти их в статьях и кодовой базе.

Еще раз спасибо за поддержку .

 
Например,
 

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

Например, с чекбоксом такой код дает реакцию на клик мыши. Галочка появляется и исчезает.

#include <Controls\CheckBox.mqh>
CCheckBox Chbox;
//+------------------------------------------------------------------+
void OnInit()
{
  Chbox.Create(0, "MyCheckBox", 0, 20, 20, 100, 40);
  ChartRedraw();
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Chbox.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+


А с вертикальным скролом - никакой реакции на нажатия кнопок мыши.

#include <Controls\Scrolls.mqh>
CScrollV Scroll;

void OnInit()
{
  Scroll.Create(0, "MyScrollV", 0, 20, 20, 40, 200);
  ChartRedraw();
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Scroll.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+

Подскажите, пожалуйста, кто знает, как заставить работать этот комбинированный элемент на графике?

 

Подскажите, как вызвать диалоговое окно?
Например, я создал панель, где есть кнопка "Закрыть все позиции". При нажатии на эту кнопку, должно возникать окошко "Вы уверены?" Да/Нет. Как это реализовать?

На данный момент унаследовался от CAppDialog, создал небольшую форму с кнопками Ok/Cancel. При нажатии на кнопку "Ок" добавил строку 

gDialogForm.Destroy();
ChartRedraw();

Но диалоговая форма всё равно остается на экране.
Как исправить?

 
Nextor #:

Подскажите, как вызвать диалоговое окно?
Например, я создал панель, где есть кнопка "Закрыть все позиции". При нажатии на эту кнопку, должно возникать окошко "Вы уверены?" Да/Нет. Как это реализовать?

На данный момент унаследовался от CAppDialog, создал небольшую форму с кнопками Ok/Cancel. При нажатии на кнопку "Ок" добавил строку 

Но диалоговая форма всё равно остается на экране.
Как исправить?

void OnChartEvent(const int id,         // Event ID
                  const long& lparam,   // Parameter of type long event
                  const double& dparam, // Parameter of type double event
                  const string& sparam  // Parameter of type string events
                 )
{
  // Close All Account
  if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"ClosePos",0)!=-1)) {
    int MB=MessageBox("Close All Positions\nAccount Profit= "+DoubleToString(AccountInfoDouble(ACCOUNT_PROFIT),2),
                      "Close All Positions?", MB_OKCANCEL|MB_ICONQUESTION);
    if(MB==1)
      ClosePosSortProfit("", -1, -1, clrGray);
  }
}
 
Nextor #:

Подскажите, как вызвать диалоговое окно?
Например, я создал панель, где есть кнопка "Закрыть все позиции". При нажатии на эту кнопку, должно возникать окошко "Вы уверены?" Да/Нет. Как это реализовать?

На данный момент унаследовался от CAppDialog, создал небольшую форму с кнопками Ok/Cancel. При нажатии на кнопку "Ок" добавил строку 

Но диалоговая форма всё равно остается на экране.
Как исправить?

Может еще этот комментарий поможет
 
Nextor #:

Подскажите, как вызвать диалоговое окно?
Например, я создал панель, где есть кнопка "Закрыть все позиции". При нажатии на эту кнопку, должно возникать окошко "Вы уверены?" Да/Нет. Как это реализовать?

На данный момент унаследовался от CAppDialog, создал небольшую форму с кнопками Ok/Cancel. При нажатии на кнопку "Ок" добавил строку 

Но диалоговая форма всё равно остается на экране.
Как исправить?

Возьмите пример панели Close On Chart Panel и в обработчики клика вставьте вызов 'MessageBox'.

В файле 'Close On Chart Panel Dialog.mqh' внесите такие изменения:

//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton1(void)
  {
   int answer=MessageBox("Close all Sell?","Close all Sell",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.ClosePositions(POSITION_TYPE_SELL);
     }
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton2(void)
  {
   int answer=MessageBox("Close all Buy?","Close all Buy",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.ClosePositions(POSITION_TYPE_BUY);
     }
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton3(void)
  {
   int answer=MessageBox("Close all Profit?","Close all Profit",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.CloseProfitPositions();
     }
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton4(void)
  {
   int answer=MessageBox("Close all Loss?","Close all Loss",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.CloseLossPositions();
     }
  }


Результат:


Close On Chart Panel
Close On Chart Panel
  • www.mql5.com
Советник-утилита. Панель на базе класса CDialog. Кнопки на базе класса СButton. Четыре кнопки для закрытия BUY, SELL, всех прибыльных, всех убыточных. Работа по текущему символу
 

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

Я пытаюсь сделать свой собственный, в моей панели при нажатии на одну кнопку другая должна быть отключена и скрыта, она будет скрыта, когда я нажимаю в области скрытой кнопки, она все еще работает

Я поместил мои коды здесь, если вы можете помочь мне, это было бы здорово

Индикатор:

//+------------------------------------------------------------------+
//|Indicator_Q_Test.mq4 |
//| Copyright 2020, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#include  <WinUser32.mqh>
#include "PanelDialog_Q.mqh"
CPanelDialogQ ExtDialog;
//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- отображение индикаторных буферов

   if(!ExtDialog.CreateQ(0,"Question",0,100,100,400,230,"This the test Question?"))
      return(INIT_FAILED);
//--- запустите приложение
   if(!ExtDialog.Run())
      return(INIT_FAILED);
 
      

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- возвращаем значение prev_calculated для следующего вызова
   return(rates_total);
  }

//+------------------------------------------------------------------+
//| Функция ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
      ExtDialog.ChartEvent(id,lparam,dparam,sparam);

  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   ExtDialog.Destroy(reason);


  }

Класс:

//+------------------------------------------------------------------+
//|PanelDialog.mqh |
//| Copyright 2009-2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Edit.mqh>
#include <Controls\ListView.mqh>
#include <Controls\ComboBox.mqh>
#include <Controls\SpinEdit.mqh>
#include <Controls\RadioGroup.mqh>
#include <Controls\CheckGroup.mqh>
#include <Controls\Label.mqh>
#include <Controls\Scrolls.mqh>
//+------------------------------------------------------------------+
//| Определяет|
//+------------------------------------------------------------------+
//--- Отступы и пробелы
#define  INDENT_LEFT_ScrollQ                         (11)      // отступ слева (с учетом ширины границы) (только для полосы прокрутки)
#define  INDENT_LEFTQ                         (11)      // Отступ слева (с учетом ширины границы)
#define  INDENT_TOPQ                          (11)      // Отступ сверху (с учетом ширины границы)
#define  INDENT_RIGHTQ                        (11)      // Отступ справа (с учетом ширины границы)
#define  INDENT_BOTTOMQ                       (11)      // Отступ снизу (с учетом ширины границы)
#define  CONTROLS_GAP_XQ                      (80)      // разрыв по координате X
#define  CONTROLS_GAP_YQ                      (40)      // расстояние по координате Y
//--- для кнопок
#define  BUTTON_WIDTHQ                        (60)     // размер по координате X
#define  BUTTON_HEIGHTQ                       (20)      // размер по координате Y
//--- для области индикации

#define  EDIT_HEIGHTQ                         (20)      // размер по координате Y
#define  GROUP_WIDTHQ                         (150)     // размер по координате X
#define  LIST_HEIGHTQ                         (379)     // размер по координате Y
#define  RADIO_HEIGHTQ                        (56)      // размер по координате Y
#define  CHECK_HEIGHTQ                        (93)      // размер по координате Y
//+------------------------------------------------------------------+
//| Класс CPanelDialog|
//| Использование: главный диалог приложения SimplePanel |
//+------------------------------------------------------------------+
class CPanelDialogQ : public CAppDialog
  {
private:

   CLabel            m_Label_Q_text;


   CButton           m_button_Yes;
   CButton           m_button_No;




   //****************************************************


public:
                     CPanelDialogQ(void);
                    ~CPanelDialogQ(void);
   //--- создать
   virtual bool      CreateQ(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2,string QText);
   //--- Обработчик событий графика
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:

   //--- создайте зависимые элементы управления

   bool              CreateLabel_Q_text(string QT);

   bool              CreateButton_Yes(void);
   bool              CreateButton_No(void);


   void              OnClick_button_Yes(void);
   void              OnClick_button_No(void);


  };
//+------------------------------------------------------------------+
//| Обработка событий|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CPanelDialogQ)

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
ON_EVENT(ON_CLICK,m_button_Yes,OnClick_button_Yes)
ON_EVENT(ON_CLICK,m_button_No,OnClick_button_No)

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Конструктор|
//+------------------------------------------------------------------+
CPanelDialogQ::CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
//| Деструктор|
//+------------------------------------------------------------------+
CPanelDialogQ::~CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
//| Создать|
//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateQ(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2,string QText)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- создайте зависимые элементы управления

   if(!CreateLabel_Q_text(QText))
      return(false);
   if(!CreateButton_Yes())
      return(false);
   if(!CreateButton_No())
      return(false);

//--- успех
   return(true);
  }


//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateLabel_Q_text(string QT)
  {
//--- координаты
   int x1=INDENT_LEFTQ;
   int y1=INDENT_TOPQ;
   int x2=ClientAreaWidth()-(INDENT_RIGHTQ+BUTTON_WIDTHQ+CONTROLS_GAP_XQ);
   int y2=y1+EDIT_HEIGHTQ;

//--- создать
   if(!m_Label_Q_text.Create(m_chart_id,"QT",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_Label_Q_text.Text(QT))
      return(false);
   if(!m_Label_Q_text.FontSize(12))
      return(false);
   if(!m_Label_Q_text.Color(clrBlack))
      return(false);
   if(!m_Label_Q_text.ColorBorder(clrBlack))
      return(false);
   if(!m_Label_Q_text.ColorBackground(clrBlack))
      return(false);
// if(!m_edit.ReadOnly(true))
// return(false);
   if(!Add(m_Label_Q_text))
      return(false);

   m_Label_Q_text.Alignment(WND_ALIGN_WIDTH,INDENT_LEFTQ,0,INDENT_RIGHTQ+BUTTON_WIDTHQ+CONTROLS_GAP_XQ,0);
//--- успех
   return(true);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateButton_Yes(void)
  {
//--- координаты
   int x1=INDENT_LEFTQ;
   int y1=INDENT_TOPQ+CONTROLS_GAP_YQ;
   int x2=x1+BUTTON_WIDTHQ;
   int y2=y1+BUTTON_HEIGHTQ;
//--- создать
   if(!m_button_Yes.Create(m_chart_id,m_name+"Yes",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_button_Yes.Text("Yes"))
      return(false);
   if(!Add(m_button_Yes))
      return(false);
   m_button_Yes.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHTQ+CONTROLS_GAP_XQ*2,0);
//--- успех
   return(true);
  }





//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateButton_No(void)
  {
//--- координаты
   int x1=INDENT_LEFTQ+CONTROLS_GAP_XQ;
   int y1=INDENT_TOPQ+CONTROLS_GAP_YQ;
   int x2=x1+BUTTON_WIDTHQ;
   int y2=y1+BUTTON_HEIGHTQ;
//--- создать
   if(!m_button_No.Create(m_chart_id,m_name+"NO",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_button_No.Text("NO"))
      return(false);
   if(!Add(m_button_No))
      return(false);
   m_button_No.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHTQ+CONTROLS_GAP_XQ*1,0);
//--- успех
   return(true);
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void CPanelDialogQ::OnClick_button_Yes(void)
  {

   Print("OnClick_button_Yes", "Last Error: ",GetLastError());

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void CPanelDialogQ::OnClick_button_No(void)
  {

   Print("OnClick_button_No", "Last Error: ",GetLastError());

m_button_Yes.Hide();
m_button_Yes.Disable();
m_button_Yes.Deactivate();

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