文章 "向指标或者EA中快速添加控制面板" - 页 2

 
Maxim Dmitrievsky:

我就是这么做的,但没什么效果。面板还是和以前一样是白色的。

编译器说 Macro redifinition(宏重定义),即像 overdivided.... 一样。

用我的第一个建议,替换原始文件中的颜色,然后重新编译 EA。

要记住我是如何在面板中重新定义颜色的,我需要四处查查,但现在没时间。

 

历史:

关于交易、自动交易系统和测试交易策略的论坛

为什么更新智能交易系统设置时面板会移动?

Andrey Khatimlianskii, 2016.03.10 13:17

大概是这样:

// BEFORE connecting 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            // 对话框边框颜色(外部)
#define  CONTROLS_DIALOG_COLOR_BORDER_DARK   C'0xB6,0xB6,0xB6'   // 对话框边框颜色(内部)
#define  CONTROLS_DIALOG_COLOR_BG            clrLightGreen       // 对话框背景(标题下方和客户端区域周围)
#define  CONTROLS_DIALOG_COLOR_CAPTION_TEXT  C'0x28,0x29,0x3B'   // 对话框标题文字颜色
#define  CONTROLS_DIALOG_COLOR_CLIENT_BG     clrAliceBlue        // 客户区域的背景颜色
#define  CONTROLS_DIALOG_COLOR_CLIENT_BORDER C'0xC8,0xC8,0xC8'   // 客户区域的颜色

// 现在连接
#include <Controls\Dialog.mqh>

 

您能给我一个简单的例子,说明应该如何扭曲CWndContainer,以便使用 .Show() 在聊天屏幕上至少显示一些正方形吗?

我已经尝试了所有方法,比如像这样,但没有错误,没有图像,也没有 .Show() 工作的迹象

#include <Controls\WndContainer.mqh>

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

//+------------------------------------------------------------------+
//| 构造函数|
//+------------------------------------------------------------------+
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:

您能给我一个简单的例子,说明如何使用 .Show() 扭曲 CWndContainer,使其至少在聊天屏幕上显示一些正方形吗?

我已经尝试了所有方法,比如像这样,但没有错误,没有图像,也没有 .Show() 工作的迹象。

为什么要使用 CWndContainer?最终会得到什么结果?
 

我不明白这里的逻辑:

//+------------------------------------------------------------------+
//| 使控件组可见
//+------------------------------------------------------------------+
bool CWndContainer::Show(void)
  {
//--- 按组元素循环
   int total=m_controls.Total();
   for(int i=0;i<total;i++)
     {
      CWnd *control=Control(i);
      //--- 检查指针
      if(control==NULL)
         continue;
      control.Show();
     }
//--- 调用父类的方法
   return(CWnd::Show());
  }

如果我有一个 Button 对象,但它没有 .Show() 方法,怎么办?

难道它不能包含在一个容器中吗?

 
Karputov Vladimir:
为什么要使用 CWndContainer?我们最终会得到什么?
一个带有买入和卖出按钮的面板,以及更多有关智能交易系统状态的通知。但它应该可以用鼠标在屏幕上拖动,但按钮却无法拖动。
 
Evgeny Potapov:
面板上有买入和卖出按钮,还有一些关于智能交易系统状态的通知。但应该用鼠标在屏幕上拖动,但按钮却无法拖动。
创建对象(按钮、列表、文本字段等)后,应将该对象添加到面板中(添加方法)。然后,在拖动面板时,所有对象将与面板一起移动。
 
Karputov Vladimir:
创建对象(按钮、列表、文本字段等)后,应将该对象添加到面板中(添加方法)。然后拖动面板时,所有对象都将随面板一起移动。

像这样吗?

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

CButton *MyButton;
CWndContainer  *MyContainer;
//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
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:
创建对象(按钮、列表、文本字段等)后,应将该对象添加到面板中(添加方法)。然后,在拖动面板时,所有对象都将与面板一起移动。

或者这不是 "添加到面板"?

所以容器不是面板?

 
Evgeny Potapov:

还是说它不是 "添加到面板"?

所以容器不是面板?

以文章中的PanelDialog2.mqh 文件为例:

//+------------------------------------------------------------------+
//|PanelDialog2.mqh
///2015年,MetaQuotes软件公司版权所有。
//|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|
//+------------------------------------------------------------------+
//-- 缩进和间隙
#define  INDENT_LEFT                         (11)      // 从左缩进(考虑到边框宽度)
#define  INDENT_TOP                          (11)      // 从顶部开始缩进(考虑到边框宽度)
#define  INDENT_RIGHT                        (11)      // 从右边开始缩进(考虑到边框宽度)
#define  INDENT_BOTTOM     

该文件创建了一个对话面板的元素。面板的标志是CDialog 类。

CDialog 类

CDialog 类是对话框组合控件的一个类。

说明

CDialog 类旨在以可视化方式组合一组功能相关的异构元素。