文章 "图形界面 I: 图形界面的动画 (第三章)"

 

新文章 图形界面 I: 图形界面的动画 (第三章)已发布:

在前面的文章中, 我们开始开发了一个容纳控件的表单类. 在本文中, 我们将继续丰富此表单类的内容, 增加在图表区域内移动表单的方法. 接着我们会把这个界面组件与核心库整合. 而且我们会实现这样的功能, 在鼠标光标移动到表单之上时, 表单控件会改变它的颜色.

在本系列前面的文章中, 我们开始开发了一个用于控件的表单类. 在本文中, 我们将继续开发此类, 为它加上在图表区域内移动表单的方法. 我们也会把这个界面组建与核心库整合. 而且, 我们会在鼠标掠过表单控件的时候改变它的颜色.

<...>

编译项目并把程序载入图表. 为了验证程序能够正确地跟踪光标所在图表窗口, 以及任何指标, 包括不在图表主窗口中载入的状况.

我基本确定您在程序载入图表之后将不能移动窗口了. 原因就是在CWindow 类的构造函数中, m_movable 变量是使用false值来初始化的, 它的意思是用户无法在图表中移动表单. 这就是为什么MQL程序的开发人员必须在代码中指定是否需要表单的移动.

CProgram 类的CreateWindow() 方法中, 按照以下代码加上一行, 编译文件并再次测试程序.

//+------------------------------------------------------------------+
//| 创建用于控件的表单                                      |
//+------------------------------------------------------------------+
bool CProgram::CreateWindow(const string caption_text)
  {
//--- 在窗口数组中增加一个窗口指针
   CWndContainer::AddWindow(m_window);
//--- 坐标
   int x=1;
   int y=1;
//--- 属性
   m_window.Movable(true);
   m_window.XSize(200);
   m_window.YSize(200);
//--- 创建一个表单
   if(!m_window.CreateWindow(m_chart_id,m_subwin,caption_text,x,y))
      return(false);
//---
   return(true);
  }

现在, 应该没有什么问题阻止表单的移动了:

图 1. 在图表上测试表单的移动

图 1. 测试表单在图表上的移动

有的时候图表窗口的大小必须能改变. 在这种时候, 会产生CHARTEVENT_CHART_CHANGE的修改图表属性的事件. 此时, 我们还没有使用任何一种方法来跟踪表单部分或全部超出图表窗口的情形. 为了避免这一点, 我们也必须在CWindow::OnEvent() 图表事件处理函数中检测此类事件.

作者:Anatoli Kazharski

 
阿纳托利编码水平、质量--一切都达到了我个人难以置信的高度。非常感谢你的出色工作!我们期待着余下的部分!
 

你好,阿纳托利、

我对使用图形界面非常感兴趣。但它在我的应用程序中不起作用。面板窗口无法移动。在示例程序 "InfoPanel.mq5 "中(将属性"Movable "设置为 true)也是如此。面板出现了,但不能移动。也许您知道问题出在哪里?(我使用的是 Windows10 和 Metatrader 5.0 版本 1340)。


罗兰

 

大家好、

我从上一部分(4)获得了源代码。现在一切正常。

致罗兰

 

使用标准库处理鼠标移动的方法是什么?我使用位于 Experts\Examples\Controls 的文件进行了测试。
当我只使用 .ChartEvent(...) 函数时,ON_MOUSE_FOCUS_SET 事件不会被处理。
当我使用 .OnEvent(...) 函数时,ON_MOUSE_FOCUS_SET 事件得到了处理,但我无法移动窗口。
当我同时使用这两个函数(先调用 .ChartEvent() 然后再调用 .OnEvent())时,ON_MOUSE_FOCUS_SET 事件得到了处理,但当我单击递增和递减按钮时,它的变化超过了一步。


   virtual bool      OnItemFocusSet(const int index);
   //--- 重新绘制
   bool              Redraw(void);
   bool              RowState(const int index,const bool select);
   bool              CheckView(void);
  };
//+------------------------------------------------------------------+
//| 图表事件的通用处理程序|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CListView)
ON_INDEXED_EVENT(ON_CLICK,m_rows,OnItemClick)
ON_INDEXED_EVENT(ON_MOUSE_FOCUS_SET,m_rows,OnItemFocusSet)
EVENT_MAP_END(CWndClient)
bool CListView::OnItemFocusSet(const int index)
  {
//--- 选择 "行"
   Select(index+m_offset);
//--- 发送通知
   EventChartCustom(CONTROLS_SELF_MESSAGE,ON_CHANGE,m_id,0.0,m_name);
//--- 已处理
   return(true);
  }
 
这个例子非常有趣,对个人成长很有帮助:)))))))非常感谢作者!
我有一个问题:当改变时间框架(重新初始化)时,图块会飞向左上角(x=0,y=0)......如何正确实现保存图块的当前坐标?

HI: 在我的脑海中有 2 种变体:
1) 将坐标写入全局变量...
2) 写入文件...
3) 很好奇您对此问题的专业解决方案!您是如何实现的?