文章 "图形界面 V: 组合框控件 (第三章)"

 

新文章 图形界面 V: 组合框控件 (第三章)已发布:

在本系列第五部分的前两章中,我们开发了用于创建滚动条和列表视图的类,在本章中,我们将讨论创建组合框(combobox)控件的类,这也是一个组合控件,包含了第五部分前面章节中讨论的一些元件。

以下是构成组合框控件的基本对象:

  1. 元件背景
  2. 文字标签 (元件描述)
  3. 按钮(Button)
  4. 下拉列表视图的标记


图 1. 组合框控件的构成部分


作者:Anatoli Kazharski

 

你做的事情很酷,很有用;)

阿纳托尔,我认为有一些地方可以改进。例如,当光标停留在任何一个列表上时,我的手会伸向滚轮来滚动列表,但可惜的是,我们滚动的是图表。而且图表滚动也会被跟踪。也许最好不要删除列表,而是滚动列表,暂时禁用图表滚动,你觉得呢?

还有一件事:我没有意识到,有没有不显示列表按钮左侧列表描述的选项?并非总是需要。

 

好吧,或者说一般来说--如果程序的主窗口处于焦点位置,则禁用图表的滚动,并当场确定是否有必要从滚轮滚动某些东西,或者不对其做出反应....。

例如,在 3D Studio MAX 中,夹紧的鼠标左键及其上下移动对任何值的增减形式都有反应。单击向上 或向下箭头,在不释放按钮的情况下将鼠标向上或向下移动,表格窗口中的数值会根据鼠标移动的方向增加或减少。

 
Artyom Trishkin:

阿纳托尔,我认为可以做一些改进。例如,当光标停留在任何一个列表上时,手会伸向滚轮来滚动列表,但可惜的是,我们滚动的是图表。这样就有了图表滚动跟踪功能。也许最好不要删除列表,而是通过暂时禁用图表滚动来滚动列表,你觉得呢?

据我所知,MQL 工具可以跟踪鼠标中键是否按下。但仍然无法跟踪是否滚动。

还有一件事:我不知道是否有不显示列表按钮左侧列表描述的选项?这并非总是必要的。

可以。创建项目时,向CComboBox::LabelText() 方法传递一个空字符串("")。

例如,在 3D Studio MAX 中,夹紧的鼠标左键及其上下移动会对某个值的增减产生反应。点击 向上 或向下箭头 ,在不松开按钮的情况下将鼠标向上或向下移动,方框中的数值会根据鼠标移动的方向增大或减小。

下一篇文章将介绍一些控件,包括 "输入框 "元素。在当前的实现中,滚动是加速的。也就是说,在增量/减量按钮上按住鼠标左键,并在这些按钮的区域内按住光标,数值就会加速滚动。

 
//+------------------------------------------------------------------+

//|ComboBox.mqh
//| 2015 年 MetaQuotes 软件公司版权所有。|
//|http://www.mql5.com ||
//+------------------------------------------------------------------+
#include "Element.mqh"
#include "Window.mqh"
#include "ListView.mqh"
//+------------------------------------------------------------------+
//| Êëàññäëÿ ñîçäàíèÿ êîìáèíèðîâàííîãî ñïèñêà                      |
//+------------------------------------------------------------------+
class CComboBox : public CElement
  {
private:
   //--- Óêàçàòåëü íà ôîðìó, ê êîòîðé ýëåìåíò ïðèñîåäèí¸í
   CWim_buttonndow          *m_wnd;
   //--- Îáúåêòû äëÿ ñîçäàíèÿ êîìáî-áîêñà
   CRectLabel        m_area;
为什么评论不再使用英语?
 
Amir Yacoby:
评论不再使用英语的原因是什么?

我也遇到过同样的情况,我认为他们目前有两个问题。


1.一些问题仍有待解决(尤其是在 MT4 中!)
2. 目前没有人可以将其翻译成英文。我也不清楚为什么主要注释不是英文的。但是,只要功能 声明是英文的,而且上面的大多数示例也是英文的,那就无所谓了。


 
MetaQuotes Software Corp.:

新文章《图形界面 V:组合框控件(第 3 章)》已发布:

作者: Anatoli KazharskiAnatoli Kazharski

文章写得很好,我很喜欢接下来的系列文章。 能否请您检查 SplitButton.mqh 第 90 行?我遇到了错误

return - 无法将常量指针转换为非常量指针。

我删除了 "const",使其正常工作。
 
Kaleem Haider:

return - 无法将常量指针转换为非常量指针。

我删除了 "const",使其正常工作。

是的,只要出现这种错误,就必须删除 const。稍后我会更新所有文章中的文件。

 

[WIN7 64bits - MetaTrader5 build 1472]

ComboBox 的 SplitString 奇怪行为。



当用户点击卖出或买入按钮时,程序会从组合框中获取所选项目,并计算订单的SL和TP。当我在调试模式(F5)下运行时,没有问题。 看来 EasyAndFast 库以某种方式覆盖了 SplitString 或 PrintFormat 或
StringToDouble 函数,或者类似的函数。但我完全不确定。 这是我的示例:

//+------------------------------------------------------------------+
//| 创建组合框 TP:SL|
//+------------------------------------------------------------------+
bool CProgram::CreateTPSLComboBox(const int x_gap, const int y_gap, const string text) {
  // 列表视图项目总数
  #define ITEMS_TOTAL1 4

  // 传递面板对象
  _tpslCombobox.WindowPointer(_mainWindow);
  
  // 附加到第一个选项卡
  _mainTabs.AddToElementsArray(0, _tpslCombobox);  
  
  // 坐标
  int x = _mainWindow.X() + x_gap;
  int y = _mainWindow.Y() + y_gap;
  
  // 列表视图中项目值的数组
  string items_text[ITEMS_TOTAL1] = {"2:4", "2:3", "3:4", "0:0"};
  
  // 创建前设置属性
  _tpslCombobox.XSize(90);
  _tpslCombobox.YSize(18);
  _tpslCombobox.LabelText(text);
  _tpslCombobox.ButtonXSize(45);
  _tpslCombobox.ItemsTotal(ITEMS_TOTAL1);
  _tpslCombobox.VisibleItemsTotal(4);
  _tpslCombobox.AreaColor(clrWhite);

  // 在组合框列表视图中存储项目值
  for(int i = 0; i < ITEMS_TOTAL1; i++)
    _tpslCombobox.ValueToList(i, items_text[i]);
  
  // 获取列表视图指针
  CListView *lv = _tpslCombobox.GetListViewPointer();
  
  // 设置列表视图属性
  lv.LightsHover(true);
  lv.SelectedItemByIndex(lv.SelectedItemIndex() == WRONG_VALUE ? 0 : lv.SelectedItemIndex());
  
  // 创建控制
  if(!_tpslCombobox.CreateComboBox(m_chart_id, m_subwin, x, y))
    return(false);

  // 将对象添加到对象组的通用数组中
  CWndContainer::AddToElementsArray(0, _tpslCombobox);
  return(true);
}

...

//+------------------------------------------------------------------+
//| 出售功能|
//+------------------------------------------------------------------+
void CProgram::Sell() {
  string sep = ":";
  ushort usep;
  usep = StringGetCharacter(sep, 0);
  string s[];
  double tp = 0.0;
  double sl = 0.0;
  if(StringSplit(_tpslCombobox.ButtonText(), usep, s) == 2) {
    PrintFormat("s01: %s - s02: %s", s[0], s[1]); // output: s01: 2 - s02: 4 
    tp = StringToDouble(s[0]);
    sl = StringToDouble(s[1]);
  }
  PrintFormat("tp: %.2f - sl: %.2f", tp, sl); // output: tp: 2.00 - sl: 2.00
...

输出结果"tp:2.00 - sl: 2.00 "应该是 "tp:2.00 - sl: 4.00"。
但同样,只有在拖放到图表上时才会出现问题。当我在调试模式下运行时,一切正常。
一些建议?

------
更新:
看起来是 MetaTrader 5 的问题,而不是 EasyAndFast 库的问题。
测试如下:
//+------------------------------------------------------------------+
//|测试。mq5
//| 2016 年 MetaQuotes 软件公司版权所有。|
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    string sep = ":";
    ushort usep;
    usep = StringGetCharacter(sep, 0);
    string s[];
    double tp = 0.0;
    double sl = 0.0;
    if(StringSplit("2:4", usep, s) == 2) {
      tp = StringToDouble(s[0]);
      sl = StringToDouble(s[1]);
    }
    PrintFormat("tp: %.2f - sl: %.2f", tp, sl);
  }
//+------------------------------------------------------------------+
输出:
输出: "tp: 2.00 - sl: 4.00" 在调试模式下 (F5):当您将脚本拖放到图表上时,输出为 "tp: 2.00 - sl: 2.00"。

如果其他人确认了这一点,我将报告给 ServiceDesk。
谢谢。

[WIN7 64bits - MetaTrader5 build 1472]
 

将所有内容复制到 mql4 文件夹,TestLibrary 专家顾问是灰色的,无法打开。专家顾问中显示 "无法打开文件"。

它在测试模式下工作吗?是否有必要调查一下为什么打不开,因为在测试模式 下工作非常重要。

 
Evgeniy Scherbina:

将所有内容复制到 mql4 文件夹,TestLibrary 专家顾问是灰色的,无法打开。专家顾问中显示 "无法打开文件"。

它在测试模式下能运行吗?是否有必要调查它无法运行的原因,因为在测试模式 下运行非常重要。

我不再支持 MT4 版本的库。

目前 MT5 的最新版本可在本文中下载:图形用户界面 X:时间元素、复选框列表元素和表格排序(第 6 版)。

在目前的开发阶段尚未进行测试,在很长一段时间内也不会进行测试。