文章 "改进面板:增加透明化、改变背景色以及继承于 CAppDialog/CWndClient"

 

新文章 改进面板:增加透明化、改变背景色以及继承于 CAppDialog/CWndClient已发布:

在这篇文章中,我们继续研究 CAppDialog 的使用。现在我们将会学习如何设置对话框的背景、边框和抬头的颜色。另外,这篇文章还提供了有关在图表中拖曳应用程序窗口时,如何增加透明化它的分步描述。我们还将探讨,怎样创建 CAppDialog 或者 CWndClient 的子类来分析如何操作控件的新特点。最后,我们将从新的角度回顾新项目。

现在,在面板的拖曳过程中修改面板对话框和按钮颜色已经在 "Live panel and transparent Button.mq5" 的代码中完全实现了:

活动面板和透明按钮

作者:Vladimir Karputov

 

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

讨论文章 "如何创建任何复杂程度的图形面板及其工作原理"

Rashid Umarov, 2018.04.23 10:30 AM

双击是指两次点击之间的时间间隔很小。因此,处理方式与普通点击相同,只需在OnChartEvent 中添加一个静态变量即可。请查看https://www.mql5.com/zh/docs/constants/chartconstants/enum_chartevents 中的示例,并做如下操作:

....

让我们通过示例演示如何在面板中添加双击处理。让我们对 CMyWndClient 类进行编辑



1.覆盖来自 CWnd 祖先的虚拟方法 OnDblClick。

class CMyWndClient : public CWndClient
  {
private:
   CButton           m_button1;                       // 按钮对象
   CButton           m_button2;                       // 按钮对象
   //--- 滚动尺寸
   int               m_scroll_size;                   // scroll_size
   //--- 存储所有者
   CAppDialog        m_owner;                         // 所有者
   //--- 隐藏不可见
   bool              m_hide_invisble;
   //---
   bool              AddButton1(void);
   bool              AddButton2(void);
protected:
   //-- 从属控件事件的处理程序
   void              OnClickButton1(void);
   void              OnClickButton2(void);
   void              OnShowScrollH(void);
   virtual bool      OnScrollLineRight(void);
   virtual bool      OnScrollLineLeft(void);
   virtual bool      OnDblClick(void);
.....
//+------------------------------------------------------------------+
//|| 覆盖 OnDblClick 事件处理功能
//+------------------------------------------------------------------+
bool CMyWndClient::OnDblClick(void)
  {
   Print(__FUNCTION__);
   return ColorBackground(GetRandomColor());
  }

2.添加对该事件的处理

//+------------------------------------------------------------------+
//| 事件处理|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CMyWndClient)
ON_EVENT(ON_CLICK,m_button1,OnClickButton1)
ON_EVENT(ON_CLICK,m_button2,OnClickButton2)
ON_EVENT(ON_DBL_CLICK,this,OnDblClick)
ON_EVENT(ON_SHOW,m_scroll_h,OnShowScrollH)
EVENT_MAP_END(CWndClient)

3.在 MyWndClient.mq5 应用程序文件中,添加用于捕捉 DoubleClick 事件的行

//+------------------------------------------------------------------+
//| 专家图表事件函数|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // 事件 ID 
                  const long& lparam,   // 长类型的事件参数
                  const double& dparam, // 双类型事件参数
                  const string& sparam) // 字符串类型的事件参数
  {
//--- 鼠标最后一次点击的时间
   static uint last_click=0;
//--- 左键单击图表
   if(id==CHARTEVENT_OBJECT_CLICK)   
     {
      uint click_time=GetTickCount();
      //Print("click_time=",click_time);
      //Print("Coordinates of the mouse click on the chart: x = ",lparam," y = ",dparam);
      if(click_time-last_click<dbl_click_time)
        {
         PrintFormat("DoubleClick! time=%d msec",click_time-last_click);
         // 将 ON_DBL_CLICK 事件发送到客户端区域 - 让它来处理该事件 
         EventChartCustom(CONTROLS_SELF_MESSAGE,ON_DBL_CLICK,ClientArea.Id(),dparam,ClientArea.Name());       
        }
      last_click=click_time;
      //---
     }
   AppWindow.ChartEvent(id,lparam,dparam,sparam);
  }

在应用程序的外部参数中添加以毫秒为单位的点击间隔时间--如果小于指定时间,将生成 DoubleClick 事件。

//+------------------------------------------------------------------+
//|MyWndClient.mq5
//| Copyright 2018, MetaQuotes Software Corp.
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.001"
#property description "基于 CMyWndClient 类的 MyWndClient 应用程序"
#property description "添加了设置背景和标题颜色的按钮"
#include "MyWndClient.mqh"
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
//--- 输入参数
input bool InpTwoButtonsVisible=false; // 面板宽度
input bool HideInvisble=false;         // 隐藏不可见
input uint dbl_click_time=500;         // 点击间隔时间,以毫秒为单位

文件附后。您可以单独查看,或将压缩包解压缩到 MQL5/Experts 文件夹中。

附加的文件:
 

视频显示,双击事件只在面板上触发。在面板之外,事件不会被捕获。

附加的文件:
 
我想知道是否有可能使面板对鼠标不透明。在 "编辑 "字段中拖动甚至编辑时,图表上的对象会粘住鼠标,从而停止拖动。
 
Photic:
我想知道是否有可能使面板对鼠标不透明。在 "编辑 "字段中拖动甚至编辑时,图形中的对象会粘住鼠标,从而停止拖动。

另外。很多时候,停止和取出都会以这种方式被卡住。

您可以尝试将它们的视图更改为虚拟视图来解决这个问题--如果没有选择要编辑的线条,移动面板就不会卡住它们。

还有......如果能知道如何在面板窗口中输出当前信息(例如,打开买入或卖出的利润或任何不断变化的当前信息),那将是一件很酷的事情。

也许有人做过类似的工作。MT4.

 
Vyacheslav Nekipelov:

***

还有一件事......如果能知道如何在面板窗口中输出当前信息(例如,打开买入或卖出的利润或任何不断变化的当前信息),那将是一件很酷的事情。

也许有人做过类似的工作。MT4.

您可以向面板输出任何信息 - 您只需编写负责输出的新方法。

但这对旧终端来说并不有趣。

下面是一个显示仓位信息的面板示例:https://www.mql5.com/zh/code/16931。
 
Vladimir Karputov:
下面是一个显示位置信息的面板示例:https://www.mql5.com/zh/code/16931

非常感谢)有机会我一定要研究一下这个主题。

 
非常好的文章!
 

谢谢你,弗拉基米尔,谢谢你的这篇文章和上一篇文章。我学到了一些对我有用的新知识。

您还没弄明白为什么第一次使用时,页眉和关闭按钮都是彩色的,但在最小化/解压缩后,颜色变化就不再影响控件 了?


 
Vasiliy Pushkaryov:

谢谢你,弗拉基米尔,谢谢你的这篇文章和上一篇文章。我学到了一些对自己有用的新观点。

您还没弄明白为什么第一次使用时,页眉和关闭按钮都是彩色的,但在最小化/解压缩后,颜色变化就不再影响控件了?


我发现了原因。请看第一次运行后和最小化/取消建模后的页眉宽度:

第一次运行后页眉的宽度

图 1:首次启动后的页眉宽度


折叠/展开后的页眉宽度

图 2:最小化/展开后的页眉宽度


 
Vladimir Karputov:

我发现了原因。请看第一次运行后和最小化/取消修改后的页眉宽度:


很好,谢谢。我在代码中添加了一行,点击按钮后,页眉开始完全着色。

//+------------------------------------------------------------------+
//| 事件处理程序|
//+------------------------------------------------------------------+
void CLivePaneButtonClicks::OnClickButton2(void)
  {
   string prefix=Name();
   int total=ExtDialog.ControlsTotal();
   for(int i=0;i<total;i++)
     {
      CWnd*obj=ExtDialog.Control(i);
      string name=obj.Name();
      //---
      if(name==prefix+"Caption")
        {
         CEdit *edit=(CEdit*) obj;
         color clr=(color)GETRGB(XRGB(rand()%255,rand()%255,rand()%255));
         edit.ColorBackground(clr);
         edit.Width(336);
         ChartRedraw();
         return;
        }
     }
  }

现在你只需在函数中覆盖这一点即可

virtual void Minimize(void);
virtual void Maximize(void);

一切都会好起来的。

不过,如果你同意,我会在新版本的分支中提醒你几次这个功能。也许他们会改正。