文章 "图形界面 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

原因: