自定义图形控件。第 2 部分 控件库·进阶篇
(2/3)· 从滚动条到多级菜单,逐一拆解 IncGUI_v2 里那些能直接抄进 EA 的现成控件
接上篇,我们继续深挖控件库。很多交易者自己写面板时从零画按钮、拼列表,反复造轮子还容易出坐标错位;其实第 2 篇给出的 15 个类已经覆盖了终端交互的大部分刚需,直接继承就能用。
水平滚动条控件怎么初始化
CHSсrollBar 类在 MQL5 图形界面里负责画一条水平滚动条,外观和交互逻辑跟垂直滚动条一致,区别只在参数语义。 调用 Init() 时,第二个参数传的不是条的高度,而是条的宽度——这一点写错就会让滚动条在窗体里变成竖直占位,肉眼立刻能看出来。 官方随包给了验证样例 eIncGUI_v2_Test_CHSсrollBar.mq5,直接拖进 MT5 跑一遍,比看说明更快确认宽度参数的实际生效范围。外汇与贵金属 GUI 自动化涉及实盘接口,相关改动请在模拟环境先验证,高风险。
「CList 列表控件的初始化与选中逻辑」
CList 是一个以文本框堆叠呈现列表项的 GUI 控件,初始化时通过 Init() 传入控件名、像素宽度以及以“项目数量”计的高度,可见行数就此固定。当实际项目数超过可见框数,垂直滚动条自动出现,这是布局阶段就要预估好的事。 选中行为有两种模式:允许取消选中、或不允许,靠 SetAllowDeselect() 切换。AddItem() 负责追加项目,SetSelectedIndex() 可代码指定选中项;把 -1 传给 SetSelectedIndex() 就能强制清空当前选中。 读状态时,SelectedIndex() 返回当前索引,-1 表示无选中;SelectedText() 直接拿文本。任意项文本用 Text(索引) 读、SetText(索引,文本) 改,DeleteItem() 删单项,Clear() 清全表。随附的 eIncGUI_v2_Test_CList.mq5 可直接在 MT5 打开验证这套接口。
◍ 多选列表的选定项遍历逻辑
CListMS 和常规列表控件的差异只在一点:它允许同时挂多个选中项,而不是新选一个就踢掉旧的。因此 SetSelected() 的签名也变了——普通列表只传索引,多选列表要传「索引 + 状态(true/false)」,true 是选中、false 是取消。想查某个项是不是被选了,用 Selected(索引) 问一声就行。 要批量处理所有选中项,靠 FirstSelected() 和 NextSelected() 配合。FirstSelected() 返回第一个选中项的索引;NextSelected() 则基于上一次调用(First 或 Next)拿到的索引,吐出下一个选中项的索引,直到没有就返回 -1。 下面这段是官方测试文件 eIncGUI_v2_Test_CListMS.mq5 里的迭代骨架,跑 MT5 打开该文件就能直接验证多选行为。外汇与贵金属 GUI 策略工具开发属高风险场景,多选状态管理出错可能导致下单逻辑误触发。
class=class="str">"cmt">// 所有选定项目迭代 class="type">int Selected=lstm.FirstSelected(); while(Selected!=-class="num">1){ class=class="str">"cmt">//======================================= class=class="str">"cmt">// 选定项目的行为 class=class="str">"cmt">// ====================================== Selected=lstm.NextSelected(); }
下拉框的只读与自由输入两态差异
CComBox 呈现为带小按钮的文本框,点按钮才展开列表,选定项文本回显到可见框内。它和纯列表控件的关键区别在输入模式:默认只能从列表选,调用 SetReadOnly(false) 后允许键盘直输。 当键盘输入的内容命中列表已有项,SelectedIndex() 返回该项索引;若输入不在列表中,SelectedIndex() 返回 -1。此时不能靠索引取值,要用 Value() 拿可见文本框字符串。 编程设定状态也有两条路:SetSelectedIndex() 等效于鼠标点选项,SetValue() 等效于键盘输入。随附的 eIncGUI_v2_Test_CComBox.mq5 可直接开 MT5 跑一遍验证这两种赋值路径的行为差异。
「水平菜单控件的事件与打勾状态管理」
CHMenu 以水平行排布多个文本框作为菜单项,左侧带竖线按钮可跳到首/尾,箭头按钮按可见数量整屏滚动。它本质是一个命令触发器:点击某项产生事件,据此执行动作或切换工具启停。 平仓类 EA 常把它当开关面板用。比如给平仓逻辑挂了指标1/2/3三个信号源,用户在菜单里勾选其中一个或组合,命中首个信号的指标才去平仓。这种场景下菜单不是导航,而是运行时配置入口。 打勾状态用 SetChecked() 标对勾;只要存在已勾项,哪怕该项滚出可视区,菜单条会变色提示有工具在跑。程序内可用 CheckedExist() 扫是否有任何勾选,用 Checked(i) 查第 i 项是否勾上,避免靠肉眼判断。 控件一律从 Init() 起步,传入名称、像素宽度、可见项数,再用 AddItem() 追加项。由于点击后要弹其它控件,需用 LastClickedX()/LastClickedY() 拿坐标,LastClickedQuarter() 回方位(1左上 2右上 3左下 4右下),LastClickedW() 回项宽,把浮层摆在合适位置。验证可直接开 eIncGUI_v2_Test_CHMenu.mq5 看交互。外汇与贵金属 GUI 工具仅辅助决策,实盘仍属高风险。
◍ 垂直菜单的排列与高度取法
CVMenu 实现的是垂直菜单,外观上项目自上而下排布,并带一条垂直滚动条用于翻看超出可视区的项。它的用途、交互逻辑和水平菜单一致,区别只在布局方向。 关键差异在尺寸获取:水平菜单靠 LastClickedW() 拿项目宽度,CVMenu 改用 ItemHeight() 来定每个项目的高度,写子类或做点击命中测试时要换方法。 想直接看运行效果,打开随附的 eIncGUI_v2_Test_CVMenu.mq5 在 MT5 里编译跑一遍,就能确认垂直滚动与项高逻辑是否如预期。外汇与贵金属 GUI 自动化涉及实盘接口,误触可能引发行情风险,验证时先用模拟账户。