你做的事情很酷,很有用;)
阿纳托尔,我认为有一些地方可以改进。例如,当光标停留在任何一个列表上时,我的手会伸向滚轮来滚动列表,但可惜的是,我们滚动的是图表。而且图表滚动也会被跟踪。也许最好不要删除列表,而是滚动列表,暂时禁用图表滚动,你觉得呢?
还有一件事:我没有意识到,有没有不显示列表按钮左侧列表描述的选项?并非总是需要。
阿纳托尔,我认为可以做一些改进。例如,当光标停留在任何一个列表上时,手会伸向滚轮来滚动列表,但可惜的是,我们滚动的是图表。这样就有了图表滚动跟踪功能。也许最好不要删除列表,而是通过暂时禁用图表滚动来滚动列表,你觉得呢?
据我所知,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;为什么评论不再使用英语?
文章写得很好,我很喜欢接下来的系列文章。 能否请您检查 SplitButton.mqh 第 90 行?我遇到了错误
return - 无法将常量指针转换为非常量指针。
[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 专家顾问是灰色的,无法打开。专家顾问中显示 "无法打开文件"。
它在测试模式下能运行吗?是否有必要调查它无法运行的原因,因为在测试模式 下运行非常重要。
我不再支持 MT4 版本的库。
目前 MT5 的最新版本可在本文中下载:图形用户界面 X:时间元素、复选框列表元素和表格排序(第 6 版)。
在目前的开发阶段尚未进行测试,在很长一段时间内也不会进行测试。
新文章 图形界面 V: 组合框控件 (第三章)已发布:
在本系列第五部分的前两章中,我们开发了用于创建滚动条和列表视图的类,在本章中,我们将讨论创建组合框(combobox)控件的类,这也是一个组合控件,包含了第五部分前面章节中讨论的一些元件。
以下是构成组合框控件的基本对象:
图 1. 组合框控件的构成部分
作者:Anatoli Kazharski