文章 "图形界面 IX: 进度条和线形图表控件 (第二章)"

 

新文章 图形界面 IX: 进度条和线形图表控件 (第二章)已发布:

第九部份的第二章致力于开发进度条和线形图表控件。与以往一样,会提供详细的实例展示如何在自定义的MQL应用程序中使用这些控件。

让我们列出所有用于开发库中创建进度条的组件。

  1. 背景
  2. 描述
  3. 指针滚动条
  4. 指针背景
  5. 百分比



图 1. 进度条控件的组成部分

作者:Anatoli Kazharski

 

超级棒

在我看来,您现在绝对领先于所有 MQL 图形开发人员。

我的结论是,我有了自己的追求。

结果令人惊叹!

祝您在进一步开发中好运。

 
Реter Konow:

超级棒

在我看来,您现在绝对领先于所有 MQL 图形开发人员。

我的结论是,我有了自己的追求。

结果令人惊叹!

祝您在进一步开发中好运。

总有一些东西值得我们为之奋斗。)

在这里,看看大师的作品,会给你更多启发:尤里-库里科夫 >>>>

 
Anatoli Kazharski:

我们总能找到奋斗的目标。)

下面是大师的作品,会给你更多启发:尤里-库里科夫 >>>。

谢谢你,真的令人印象深刻!

我想问你一个问题...

你使用 OOP 创建了你的项目。你实现了几乎所有的基本控件。你创建了一个丰富的库...

同时,你在工作中使用了多少代码?

例如,您使用了多少 MT、Canvas 等控件库?

就我个人而言,我必须从零开始,在全新的技术上创建一切,不可能使用已经开发出来的东西。

将来,其他开发人员也无法继续开发我的项目,他们也无法参与开发,因为除了我之外,其他人都不熟悉这项技术。

而你的情况恰恰相反...所有程序员都能参与改进和开发你的程序库。

而唯一能阻止这一切的就是懒惰。

 
Реter Konow:

同时,您在工作中已经使用了多少代码?

例如,您在 MT、Canvas 等控件库中使用了多少?

在本系列的第一篇文章中,我回答了这个问题:图形用户界面 I. 准备库结构(第 1 章):准备控件库结构(第 1 章)。其中介绍了用于标准图形对象原型的标准库类结构。

我在项目中使用的类列表如下

理想情况下,应该只剩下一个类 -CCanvas。有关此主题的有用主题请参见此处:在画布上开展众包项目 >>>

在开始开发之前,我研究了创建图形界面的标准库和Dmitry Fedoseev 的版本。然后,我列出了一份我个人所欠缺的清单,并开始了项目工作。需要完成的工作仍然很多,而且还在不断更新,以满足其他感兴趣的用户的建议。只是这些工作主要是在个人通信中进行的。我们还在努力解决在项目中使用程序库时逐渐暴露出来的错误。

唯一能阻止这一切的就是懒惰。

没有任何问题。)

 
Anatoli Kazharski:

在本系列的第一篇文章中,我回答了这个问题:图形界面 I:准备库结构(第 1 章)。这篇文章介绍了用于处理标准图形原始对象的标准库的类结构。

我在项目中使用的类列表如下

理想情况下,应该只剩下一个类 -CCanvas。有关此主题的有用主题:在画布上开展众包项目 >>>

在开始开发之前,我研究了创建图形界面的标准库和Dmitry Fedoseev 的版本。然后,我列出了一份我个人所欠缺的清单,并开始了项目的开发工作。需要完成的工作仍然很多,而且还在根据其他感兴趣用户的建议不断更新。只是这一切主要都是在私人通信中进行的。我也在处理在项目中使用程序库时逐渐暴露出来的错误。

这方面没有任何问题。)

感谢您的详细解答。)

祝你的工作更有成果。

 

阿纳托利,很抱歉打扰您,但我想知道如何才能在一个计算量很大的循环中更新进度条。

例如,我们有一个进度条 m_progress_bar,在 CProgram 内部有一个循环。

   m_progress_bar.Show();  // 是没有意义的,因为在显示绑定它的窗口 (m_window.Show()) 时,它已经立即可见、
                           // 我希望将其创建为隐藏状态,并在需要时显示出来
   int total=1000;         // 希望用进度条显示的循环迭代次数 
   for(int i=0;i<total;i++)
     {
      Func();  // 在循环的每次迭代中进行大量计算的函数
      m_progress_bar.Update(i,total);  // 什么也不做:进度条处于 "挂起"--初始状态。
     }
   //--- 循环完成后,进度条应该隐藏、 
   //---------------------------------------------------在这种情况下,循环过程中不会更新,然后用另一个对象覆盖它,将其隐藏起来 
   m_progress_bar.Hide();  由于某些原因,// 不能隐藏进度条,我必须将其隐藏在另一个图形对象下。

您能在这样一个 "抽象 "的例子中解释一下我不明白的地方吗?

 
传递一些数据也无妨....Artem,这只是一种数据类型,应该分配值。
 
Алексей Тарабанов:
传递一些数据也无妨。

这个怎么样?

m_progress_bar.Update(i,total);
 
Artyom Trishkin:

这个怎么样?

没用的。
 
Алексей Тарабанов:
没用。

为什么不行?

//+------------------------------------------------------------------+
//| 更新进度条|
//+------------------------------------------------------------------+
void CProgressBar::Update(const int index,const int total)
  {
//--- 设置新索引
   CurrentIndex(index);
//--- 设置新范围
   StepsTotal(total);
//-- 计算指标的宽度
   double new_width=(m_current_index/m_steps_total)*m_bar_bg.XSize();
//--- 如果小于 1,则进行调整
   if((int)new_width<1)
      new_width=1;
   else
     {
      //--- 调整框架宽度
      int x_size=m_bar_bg.XSize()-(m_bar_border_width*2);
      //--- 如果出界则更正
      if((int)new_width>=x_size)
         new_width=x_size;
     }
//--- 为指示器设置新的宽度
   m_indicator.X_Size((int)new_width);
//-- 计算百分比并形成字符串
   double percent =m_current_index/m_steps_total*100;
   string desc    =::DoubleToString((percent>100)? 100 : percent,m_digits)+"%";
//--- 设置新值
   m_percent.Description(desc);
  }
//+------------------------------------------------------------------+