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

 
@Vladimir Karputov
Vladimir 为什么关闭一个面板时,两个面板都会关闭?如何避免这种情况?
#include <Controls\Dialog.mqh>

CAppDialog AppWindow;
CAppDialog AppWindow2;

int OnInit()
  {
//--- 创建应用程序对话
   if(!AppWindow.Create(0,"AppWindow",0,20,20,360,324))
      return(INIT_FAILED);
   if(!AppWindow2.Create(0,"AppWindow",0,20+400,20,360+400,324))
      return(INIT_FAILED);
//--- 运行应用程序
   AppWindow.Run();
   AppWindow2.Run();
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
//--- 销毁对话
   AppWindow.Destroy(reason);
   AppWindow2.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| 专家图表事件函数|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // 事件 ID 
                  const long& lparam,   // 长类型的事件参数
                  const double& dparam, // 双类型事件参数
                  const string& sparam) // 字符串类型的事件参数
  {
   AppWindow.ChartEvent(id,lparam,dparam,sparam);
   AppWindow2.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
Vladimir Karputov
Vladimir Karputov
  • www.mql5.com
Люди. Граждане! Огромная просьба - заполняйте свой профиль на сайте и пользуйтесь стандартными программами - устанавливайте Skype. У Skype есть очень полезная функция - показ рабочего стола. В таком случае можно оперативно подсказать по возникшей проблеме. Помните - время - деньги! Древняя народная мудрость гласит: если хочешь помочь...
 
Ruslan Khasanov:
为每个窗口设置不同的名称 - AppWindow 和 AppWindow1 等。

它们已经有了不同的名称

筛查

更改字符串

if(!AppWindow2.Create(0,"AppWindow2",0,20+400,20,360+400,324))

并没有任何作用。
还是你有其他意思?

 
是的,确实弄错了...
 
peterlogin:
*** 如何避免这种情况?

一个顾问--一个小组。

 
如何使面板位于比面板本身晚创建的对象之上?

例如,位于线条之上:
范例
 
peterlogin:
如何使面板位于比面板本身晚创建的对象之上?例如,在线条上:


不要在面板创建后再创建图形对象

或者折叠/展开面板。
Документация по MQL5: Графические объекты / ObjectCreate
Документация по MQL5: Графические объекты / ObjectCreate
  • www.mql5.com
[in]  Номер подокна графика. 0 означает главное окно графика. Указанное подокно должно существовать, в противном случае функция возвращает false. Возвращает true при успешной постановке команды в очередь указанного графика, иначе false. Если объект был уже создан ранее, то производится попытка изменить его координаты. При вызове ObjectCreate...
 
与此主题无关的评论已移至"来自 MQL5 MT5 MetaTrader 5 初学者的问题"。
 

大家好

一个自学者的问题!

当我们使用库创建面板时,如何将面板置于与左上角不同的角落?

我使用了 OBJ_PROP_Corner,但我认为使用 Panel.Align 和 Panel.Alignment 有更好的办法。我玩了一圈,但作为一个非程序员,我不知道要传递哪些参数 以及如何传递。例如,Panel.Alignment(CRect &rect) 和 Rect 是什么意思?

如有任何帮助,不胜感激


谢谢

迭戈

 
Diego :

大家好

一个自学者的问题!

当我们使用库创建面板时,如何将面板放在与左上角不同的角落?

我使用了 OBJ_PROP_Corner,但我认为使用 Panel.Align 和 Panel.Alignment 有更好的办法。我玩了一圈,但作为一个非程序员,我不知道要传递哪些参数以及如何传递。例如,Panel.Alignment(CRect &rect) 和 Rect 是什么意思?

如有任何帮助,不胜感激


谢谢

迭戈

在创建面板时,我们会指明坐标。AppWindowEditDefine.mq5 文件示例

//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit()
  {
   
***
//--- 创建应用程序对话框
   if(!ExtDialog.Create(0,"AppWindow Edit Define",0,40,40,380,344))
      return(INIT_FAILED);
//--- 运行应用程序
 

我注意到*.Destroy() 函数经常不起作用。在调用 ExpertDeinit() 函数后,它还会将对象保留在图表上,尤其是在快速更改时间框架时。

一个简单的解决方法是使用指针,而不是直接创建、修改和销毁CAppDialog 对象。

CAppDialog AppWindow;		//Declare CAppDialog object

AppWindow.Destroy(...);		//Destroy Window object(s)

上述函数现在变成了这样:

CAppDialog *AppWindow;		//Declare CAppDialog pointer
AppWindow = new CAppDialog();	//Create new CAppDialog object at ptr address

AppWindow.Destroy(...);		//Destroy Window object(s)
delete AppWindow;		//Set the "delete" flag for objects at the ptr address (in case *.Destroy() fails)
AppWindow = NULL;		//Set the ptr address to NULL

创建自定义窗口类后,我还会像这样创建和销毁所有按钮、面板和其他对象。工作起来得心应手!


*注:将删除 标志和指针设置为NULL 可能有些矫枉过正,但我在实施后就再也没有出现过遗留对象。

Documentation on MQL5: Checkup / Point
Documentation on MQL5: Checkup / Point
  • www.mql5.com
Checkup / Point - Reference on algorithmic/automated trading language for MetaTrader 5