文章 "如何创建任意复杂度的图形面板" - 页 12

 
Vladimir Karputov #:

这是禁止的。面板与图表相连。

非常感谢。我明白了

我还想问一个问题。

我想创建一个面板来显示一些表格,就像这样






















但我只能找到下面的控件,这是否意味着面板不支持创建表格,谢谢。

文本标签

基于 "文本标签 "图形对象的控件

CBmpButton

基于 "位图标签 "图形对象的控件

CButton

控件,基于 "按钮 "图形对象

CEdit

控件,基于 "编辑栏 "图形对象

面板

基于 "矩形标签 "的控件

图片

控件,基于 "位图标签

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 # :

非常感谢我明白了

请允许我再问一个问题。

我想创建一个面板来显示一些表格,就像这样






















但我只能找到下面的控件,这是否意味着面板不支持创建表格,谢谢。

文本标签

基于 "文本标签 "图形对象的控件

CBmpButton

基于 "位图标签 "图形对象的控件

CButton

控件,基于 "按钮 "图形对象

CEdit

控件,基于 "编辑栏 "图形对象

面板

基于 "矩形标签 "的控件

图片

控件,基于 "位图标签

您需要自己创建表格。请在文章和 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,创建了一个带有 "确定"/"取消 "按钮的小表单。当点击 "确定 "按钮时,我添加了一行内容

gDialogForm.Destroy();
ChartRedraw();


如何解决?

 
Nextor 对话框 吗?
例如,我创建了一个面板,面板上有一个按钮 "关闭所有位置"。当我点击这个按钮时,应该弹出一个 "您确定吗?是/否。如何实现?

目前,我继承了 CAppDialog,创建了一个带有 "确定"/"取消 "按钮的小表单。当点击 "确定 "按钮时,我添加了一行内容

但对话表单仍留在屏幕上。
如何解决这个问题?

void OnChartEvent(const int id,         // 事件 ID
                  const long& lparam,   // 长事件类型参数
                  const double& dparam, // 双事件类型参数
                  const string& sparam  // 参数类型为字符串事件
                 )
{
  // 关闭所有账户
  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,创建了一个带有 "确定"/"取消 "按钮的小表单。当点击 "确定 "按钮时,我添加了一行内容

但对话表单仍留在屏幕上。
如何解决这个问题?

也许这条 评论会有所帮助
 
Nextor 对话框 吗?
例如,我创建了一个面板,面板上有一个按钮 "关闭所有位置"。当我点击这个按钮时,应该弹出一个 "您确定吗?是/否。如何实现?

目前,我继承了 CAppDialog,创建了一个带有 "确定"/"取消 "按钮的小表单。当点击 "确定 "按钮时,我添加了一行内容

但对话表单仍留在屏幕上。
如何解决这个问题?

关闭图表 面板为例,在点击处理程序中插入 "MessageBox "调用。

在 "Close On Chart Panel Dialog.mqh "文件中进行这些更改

//+------------------------------------------------------------------+
//| 事件处理程序|
//+------------------------------------------------------------------+
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);
     }
  }
//+------------------------------------------------------------------+
//| 事件处理程序|
//+------------------------------------------------------------------+
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);
     }
  }
//+------------------------------------------------------------------+
//| 事件处理程序|
//+------------------------------------------------------------------+
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();
     }
  }
//+------------------------------------------------------------------+
//| 事件处理程序|
//+------------------------------------------------------------------+
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);
  }

//+------------------------------------------------------------------+
//| 图表事件函数|
//+------------------------------------------------------------------+
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
//| 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>
//+------------------------------------------------------------------+
//| defines|
//+------------------------------------------------------------------+
//-- 缩进和间隙
#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();

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