MQL 作为 MQL 程序图形界面的标记工具(第三部)。 窗体设计师·综合运用
(3/3)· 从类初始化到可视化布局,这篇把前两篇的标记语法真正变成可拖拽的界面原型
接上篇,我们已经在 MQL 里把界面元素的类层次、缓存和样式化跑通,但手动写标记仍然费时且易错。本文聚焦窗体设计师这个 POC 工具,看它如何把语法变成可可视编辑的对话框。编辑器不追求覆盖所有属性,先用最小集验证概念,后续再扩。
Inspector 对话框的字段与交互细节
Inspector 对话框承载当前在 Designer 中选中的对象、或待创建对象的属性编辑。名称(字符串)与类型(下拉选择)是强制字段;宽度、高度以像素定义尺寸,但若下方指定了拉伸模式(如绑定左右边界填满容器),这两个值会被忽略。在高度或宽度字段上按住 Shift 单击鼠标,可重置为默认宽 100、高 20。 所有 SpinEdit 类控件都支持鼠标拖拽改值:在控件内按住左键左右移动,能按比例快速变更数值覆盖的像素距离,比点小箭头按钮顺手得多。ControlsPlus 文件夹里的控件均允许被任意程序改写。
| 内容对齐下拉仅对 CBoxV、CBoxH、CEdit 开放,其余类型锁定。CBox 容器可用 center / justify / left | top / right | bottom / stack 全模式;CEdit 只认 ENUM_ALIGN_MODE 的 center / left / right。Text 字段决定 CButton 标题与 CLabel、CEdit 内容,其他类型禁用。 |
|---|
Color 下拉从 Web 颜色取背景色,只作用于 XBox、Button、CREdit;复合控件因涉及多组件重绘未开放着色。其实现改了 CListView,加入 color 模式由 SetColorMode 开启,新类 ComboBoxWebColors 调用它。标准库 GUI 默认色因构造期不赋值、Create 才赋值,硬读会建无用图表对象,故未纳入列表。要复位某类控件默认色,选列表首项 clrNONE 的 empty。Web 与标准色表在 LayoutColors.mqh。 Alignment 切换器对应 ENUM_WND_ALIGN_FLAGS 加 WND_ALIGN_CONTENT(仅容器);Shift 单击可同步翻转 4 个基础标志。Spinners 边距顺序为左、上、右、下,Shift 单击清零,Ctrl 单击把当前值铺到其余三字段。 Apply 提交改动即新建或修改控件,新对象进所选容器或含选中控件的容器。鼠标点选高亮红框,CLabel 例外;插入后自动选中。空对话框只能先塞 CBoxV/H,首容器默认拉伸满窗。重复点已选元素弹删确认。 TestMode 按钮切换编辑/测试:未按可点选删除,按下后近似实盘运行且禁编辑。Export 存文本布局(layout+时间掩码.txt);Shift+Export 存二进制 .mql 可断点续编,启动后空表单时同按钮可载 layout.mql。顶部元素下拉与画布选择双向联动。 编辑错误分两类:轻量是越界或假属性,看 Export 出的 MQL 标记改 Inspector 即可;重类是插错容器,只能删了重加。当前版未穷举参数校验,自适应重算可能出问题。建议常按 Shift+Export 存二进制,出事回退到最后正常配置。
「用 Designer 还原 Inspector 标记的实操边界」
在 MT5 的 Designer 里把 Inspector 的界面结构重做一遍,起点是添加四个上部字符串与字段,用来设名称、类型和宽度。控件类型、对齐、配色都能拖出来;含字段名的标签必须用 CEdit 而非 CLabel,因为后者不支持文本对齐和背景色。Inspector 没有“只读”属性,所以只能给 CEdit 赋灰底假装不可编辑,真正只读要在 MQL 里把对象切到只读模式。 编辑窗体只是外部表示,和 MQL 标记绑定。随时点 Export 就能看到生成的 MQL 代码,最终对话框和 Inspector 理论对应,但细节有差。本例只用标准 ControlsPlus 类,非标准的 x-属性派生类没碰——布局只含外部形态和标准行为,状态跟踪和响应代码得程序员自己写。 导出会得到 layout-inspector.txt 和 layout-inspector.mql 两个文件。文本标记可塞进任何项目的布局头文件,附件里带了空 DummyForm 对话框项目,把标记粘进 CreateLayout 里注释 '// insert exported MQL-layout here' 的位置即可。注意原对话框尺寸 200*350 已在布局文本里,要在 _layout<DummyForm> dialog(this...) 之后、复制布局之前插一段设尺寸限制的码,给控件留空间且禁止缩窗。 编译运行后副本很像但仍漏两块:下拉和 spinner 是空的不能用,对齐组视觉空是因为没生成复选框(标准库按初始大小藏了 5 个,在对象列表能看见);缩进 spinner 组没转过来,因为它是 Inspector 里按数组建的,编辑器做不到,只能拆 4 个独立元素再手改。点任意控件,窗体把名称、类、ID 打进日志。二进制 layout-inspector.mql 改名 layout.mql 后能加载回 Inspector 接着编。 Designer 为带列表或分组的控件用宏 DUMMY_ITEM_NUMBER 造伪数据,默认 11 条,切 TestMode 就能用。交易面板示例同理,用着色容器看清排布;但编辑器只出生成窗口和初态的 MQL,防错、响应、发单逻辑全要手撸。日历控件不支持时间输入,下拉要手填,止损价和单位、交易量算法都得替换合适控件。外汇与贵金属 GUI 自动化高风险,参数误设可能错单。 把标记导进空窗体后,图形编辑器不是必选项——文本直接改也行,编辑器优势只是即时预览且仅有最基础功能。
Width(class="num">200); Height(class="num">350); CSize sz = {class="num">200, class="num">350}; SetSizeLimit(sz);
◍ 开源标记界面还能怎么补
这套基于 MQL 标记技术做图形界面的思路,核心代码已经开源,附件压缩包 112.66 KB,在 MT5 里直接解压就能跑起基础编辑器。它目前只实现了最小可用集:拖出控件、改属性、生成标记,但撤销、容器内任意位置插入、分组、剪贴板复制粘贴都还没做。 有读者把代码往 MQL4 移植时踩了坑——GroupTemplate.mqh 在 MQL4 下直接报错,原因是 MQL5 的模板类型方法调用机制 MQL4 并不支持,不重写基本搬不过去。另一处暗坑是编译器优化:某次构建后,发布版里对象的点击优先级乱了,底层控件抢了上层事件,调试版却正常,社区反馈后官方没回应。 想自己接着写,从字体缩放宏入手最直观。下面这段就是有人提的减号补丁和 DPI 自适应两版,前者把字号硬改成负十,后者按屏幕 DPI 动态折算。 外汇和贵金属 GUI 自动化高风险,改完参数请在策略测试器先验证交互逻辑,别直接上实盘。
class="macro">#define CONTROLS_FONT_SIZE(-class="num">10) class="macro">#define CONTROLS_FONT_SIZE((class="type">int)(class="num">10.0 / (TerminalInfoInteger(TERMINAL_SCREEN_DPI) / class="num">96.0)))