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 文件夹中。
我想知道是否有可能使面板对鼠标不透明。在 "编辑 "字段中拖动甚至编辑时,图形中的对象会粘住鼠标,从而停止拖动。
另外。很多时候,停止和取出都会以这种方式被卡住。
您可以尝试将它们的视图更改为虚拟视图来解决这个问题--如果没有选择要编辑的线条,移动面板就不会卡住它们。
还有......如果能知道如何在面板窗口中输出当前信息(例如,打开买入或卖出的利润或任何不断变化的当前信息),那将是一件很酷的事情。
也许有人做过类似的工作。MT4.
***
还有一件事......如果能知道如何在面板窗口中输出当前信息(例如,打开买入或卖出的利润或任何不断变化的当前信息),那将是一件很酷的事情。
也许有人做过类似的工作。MT4.
非常感谢)有机会我一定要研究一下这个主题。
谢谢你,弗拉基米尔,谢谢你的这篇文章和上一篇文章。我学到了一些对自己有用的新观点。
您还没弄明白为什么第一次使用时,页眉和关闭按钮都是彩色的,但在最小化/解压缩后,颜色变化就不再影响控件了?
我发现了原因。请看第一次运行后和最小化/取消建模后的页眉宽度:

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

图 2:最小化/展开后的页眉宽度
我发现了原因。请看第一次运行后和最小化/取消修改后的页眉宽度:
很好,谢谢。我在代码中添加了一行,点击按钮后,页眉开始完全着色。
//+------------------------------------------------------------------+ //| 事件处理程序| //+------------------------------------------------------------------+ 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);
一切都会好起来的。
不过,如果你同意,我会在新版本的分支中提醒你几次这个功能。也许他们会改正。

新文章 改进面板:增加透明化、改变背景色以及继承于 CAppDialog/CWndClient已发布:
在这篇文章中,我们继续研究 CAppDialog 的使用。现在我们将会学习如何设置对话框的背景、边框和抬头的颜色。另外,这篇文章还提供了有关在图表中拖曳应用程序窗口时,如何增加透明化它的分步描述。我们还将探讨,怎样创建 CAppDialog 或者 CWndClient 的子类来分析如何操作控件的新特点。最后,我们将从新的角度回顾新项目。
现在,在面板的拖曳过程中修改面板对话框和按钮颜色已经在 "Live panel and transparent Button.mq5" 的代码中完全实现了:
作者:Vladimir Karputov