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

 
Alexander:

您好!

我有这样一个问题--我想在交易面板上创建几个标签,即按下一个按钮会出现一组项目,按下另一个按钮会出现另一组项目。为了隐藏一个选项卡中的元素,我在选项卡按钮的 onClick 事件处理程序中为该元素应用了 Hide() 属性,这样该元素在面板上就不再可见,但它的属性不会丢失,如果点击该元素所在的位置,面板的 onEvent() 将接受该事件。问题是--如何让隐藏的元素也不对用户的任何操作做出反应。我尝试在按钮选项卡的 onClick 方法中再次启用属性 Element.Disable(),但什么也没发生,该元素对按钮点击有反应,因此虽然不可见,但仍有反应。如何通过点击一个标签页,以编程方式将其关闭,然后通过点击另一个标签页,以编程方式将其打开?

请尝试修补控件库:Wnd.mqh 文件中的 OnMouseEvent 方法开头少了一行:

if(!IS_ENABLED || !IS_VISIBLE) return false;

详细信息请参阅文章(OLAP 在交易中的应用(第 2 部分)--这篇文章是关于 OLAP 的,但有一部分是关于图形用户界面的,其中提到了上述问题):

在最小化状态下,"调整大小 "按钮被隐藏并处于非活动状态。问题出在 CWnd::OnMouseEvent 方法上。它缺少这样的检查:

  // if(!IS_ENABLED || !IS_VISIBLE) return false; - 这一行不存在

显然,这个问题可以通过设置控件的适当 Z 排序来解决然而,即使在这里我们也发现了一个缺陷--该库没有考虑元素的 Z 排序。特别是,如果你研究一下 CWndContainer::OnMouseEvent 方法,你会看到一个简单的循环,以相反的顺序遍历所有下级元素,而没有试图通过 Z 顺序来确定它们的优先级。

因此,要么需要另一个库的 "补丁",要么需要在派生类中使用一些 "技巧"。

原则上,标准控制库中有很多需要修正的地方。因此,我们编写了 ControlsPlus 的另一种实现方法,而且已经打了补丁--您可以在MQL 作为标记 MQL 程序图形界面的一种方法 这篇文章中获得它的全部内容。第 2 部分(如果您感兴趣,还有第 1 和第 3 部分)。

Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
  • www.mql5.com
В первой части публикации мы рассмотрели базовые принципы описания раскладки графического интерфейса MQL-программ на языке MQL. Для их реализации потребовалось создать несколько классов, отвечающих непосредственно за инициализацию интерфейсных элементов, их объединение в общую иерархию и настройку свойств. Сейчас мы готовимся перейти к более...
 
Stanislav Korotky:

尝试修补控件库:Wnd.mqh 文件缺少 OnMouseEvent 方法开头的一行:

详情请参阅文章(OLAP 在交易中的应用(第 2 部分)--该文章是关于 OLAP 的,但有一部分是关于图形用户界面的,其中提到了上述问题):

基本上,标准控制库中有很多东西需要调整。这就是为什么我们编写了一个已经打了补丁的 ControlsPlus 替代实现--你可以在MQL 作为标记 MQL 程序图形用户界面的一种手段 这篇文章中获得它的全部内容。第二部分(如果您感兴趣,还有第一部分和第三部分)。

谢谢,我们会尝试的。

 

如何通过 OnTick 向CLabel 写入/发送文本?

class CControlsDialog : public CAppDialog
{
private:
CLabel m_label;// CLabel 对象

.....

void OnTick()
{

m_label.Text(DoubleToString(Ask,4));

....

出现错误

m_label' - 未声明标识符 ...

出了什么问题?

Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
  • www.mql5.com
//|                                                ControlsLabel.mq5 | //|                        Copyright 2017, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| defines                                                          |  INDENT_LEFT                         (11)      ...
 
Renat Akhtyamov:

如何从 OnTick 向CLabel 写入/传输文本?

我得到的错误信息是

m_label' - 未声明标识符 ...

有什么问题?

您是否按照帮助 中所示的CreateLabel() 函数绑定了图表、坐标等?

 
Vasiliy Pushkaryov:

帮助 中显示了CreateLabel() 中与图表、坐标等的绑定,您完成了吗?

是的

如果在这里向对象写入文本,一切都会正常。

但如果我尝试在 OnTick 中写入,就会失败。

你不需要在每次 tick 时都重新创建对象吧?
 
Renat Akhtyamov:

如果就在这里向对象写入文本,则一切正常。

但如果我尝试在 OnTick 中写入,就会失败。

你不需要在每次 tick 时都重新创建对象吧?
如果将m_label 移到公共 部分呢?
 
Vasiliy Pushkaryov:
如果把m_label 移到公共 部分呢?

我试过了,还是一样的错误。

只是我是在 4pc 上做的。

我想这就是问题所在。

另外,这个也不行,虽然它能编译。

m_scroll_v1.Disable();(我想切换单选按钮,改变界面很有趣)。Destroy()可以正常工作,但 Disable 并不想这样做

 
Renat Akhtyamov:

尝试过

只是我是在 4RK 上做的。

我想这就是问题所在。

另外,这个程序虽然能编译,但不能工作。

m_scroll_v1.Disable();(我想切换单选按钮,改变界面很有趣)。Destroy()可以正常工作,但 Disable 并不想这样做

在 4 中一切正常。您已经定义了对象。比如 Panel.m_label.Text("Max.Margin")。
 
Vasiliy Pushkaryov:
一切都在 4 中运行。而您定义的对象比如 Panel.m_label.Text("Max.Margin")。

这样就可以了。

谢谢!

我首先添加了父对象,然后将其移至公共对象,这样就可以了。

这是 m_scroll_v1。Disable(); 还不起作用

 
Renat Akhtyamov:

它是这样工作的

谢谢!

先添加了父级,然后将其移至公共级,现在就可以了

而这个 m_scroll_v1.Disable(); 还不起作用

我还没有遇到过。我不知道。Stanislav 在本主题的第 27 个帖子中回答了其中一个问题。