自定义图形控件。第 2 部分 控件库·综合运用
🧩

自定义图形控件。第 2 部分 控件库·综合运用

(3/3)·从进度条到表格,把 15 个图形控件直接拖进 EA 界面,省下重复造轮子的时间

含代码示例实战向 第 3/3 篇
自己从头写滚动条和菜单,往往卡在坐标同步和事件路由上,拖慢整个 EA 开发。这篇把已封装好的控件库拆开讲,直接引用就能用。接上篇的输入框与基础类,这里补齐剩余控件的落地方式。

用 CHProgress 给耗时循环加进度条

CHProgress 是标准库里的水平进度条控件,专门把任务进度按百分比画出来。典型场景是在研究性图表上给每根 K 线跑复杂计算时,左边显示已完成百分比,右边显示预计剩余时间,让你知道程序没卡死。 初始化时 Init() 接收两个参数:控件名称和像素宽度。进循环前调 Begin() 传入最小值和最大值;循环里用 SetValue() 更新数值;跑完调 Reset() 恢复初始样式。 每次 SetValue() 都会触发图形对象重绘,这在长循环里很吃资源,可能把循环本身拖慢到不可接受。控件因此提供 SetRefreshInterval(),传秒级间隔进去后,SetValue() 只在距上次重绘超过间隔时才真正计算并重绘。 附带示例见 eIncGUI_v2_Test_CHProgress.mq5,开 MT5 加载后改 Begin() 的上下限和循环次数,就能直观看到刷新间隔对 CPU 占用的差异。外汇与贵金属自动化涉及高风险,此类 UI 优化不改变策略盈亏概率。

「CDialer 拨号器控件的独立用法」

CDialer 是图形库里一个可独立挂载的拨号器控件,设计上本供 CDialerInputBox 内部调用,但单独拖出来也能用。它典型的触发方式是:平时控件隐藏,监听到任意键动作后显形,用户在面板上拨数字、点 OK,程序再通过 Value() 把这次输入捞走。 拨号器底部文本框实时回显输入内容;面板上 X 代表不改值直接关, C 清空输入, OK 确认采纳,数字键与小数点自明, '-' 键切换正负号。上一次确认的值会常驻在关联输入框位置,旁边留一个展开按钮随时再呼出拨号盘。 初始化只往 Init() 传一个参数:控件名称。想看真实跑起来的样子,直接开 MT5 加载随附的 eIncGUI_v2_Test_CDialer.mq5,点几下就能验证键值回流逻辑。外汇与贵金属图表上挂这类自定义面板需注意,实盘环境消息阻塞可能导致按键响应延迟,属高风险操作场景。

◍ 带输入框的拨号器怎么玩

CDialerInputBox 把输入框和拨号器揉在一起:一个能展开相邻拨号器的文本框,旁边带按钮。它有两种输入模式——纯拨号器输入,或者拨号器加键盘都能录。 想锁死键盘只留拨号?调 SetReadOnly() 就能切换。Init() 要喂四个参数:控件名、像素宽度、小数位数(决定数值显示格式)、还有挨着控件显示的说明文字。 随附的 eIncGUI_v2_Test_CDialerInputBox.mq5 是直接能开的验证样本,MT5 里加载后能看到带说明的像素宽度控件实际渲染效果,外汇/贵金属面板开发高风险,参数错位可能让下单数值显示异常。

CTable 做数据表控件时的尺寸与合并坑

CTable 就是标准数据表控件,Init() 只接三个参数:名称、像素宽、像素高。表真实大小由行列数和各自尺寸算出,但绝不会超过 Init() 设的框;一旦算出来超了,滚动条自动出现,这点在大屏多列行情快照里很容易触发。 初始化后先用 SetCollsCount() 和 SetRowsCount() 定行列,或者反复调 AddRow() 逐行加。填值走 SetCellText(),顺手能用 SetCellBGColor()、SetCellTxtColor()、SetCellFontSize()、SetCellFont() 改单元格外观,行高列宽分别交给 SetRowHeight() 和 SetCollWidth()。 合并单元格用 SetCellsMerge(),四个参数是行索引、列索引、RowSpan、CollSpan。RowSpan 管纵向合几格,CollSpan 管横向合几格;两个距离都设回 1 就能拆开复原,逻辑跟 HTML 的 rowspan/colspan 一致。 点单元格会触发十字高亮:整行整列换色,再点同一行恢复标准色,开关靠 SetAllowSelection(),LastClickedRow() 和 LastClickedColl() 能拿到点击坐标。HTML() 可导出表代码存文件,也能不渲染控件只取代码。随附 eIncGUI_v2_Test_CTable.mq5 可直接开 MT5 跑一遍验证上述行为。

「把标准控件当积木用」

这套 GUI 控件组没法替你包办程序与用户交互里的所有麻烦,但实测能覆盖绝大多数常规场景:复选框管开关、单选钮加下拉列表管选项互斥与选取、数字框配微调钮或拨号器做快速录入,列表和表格负责把数据摆出来给人看。 如果现有件仍不够贴手,正确思路不是重写整套框架,而是拿其中几个当底层组件去拼更专用的控件——比如用编辑框加按钮封装成带校验的输入条。外汇与贵金属 EA 面板交互复杂,这种拼装能降不少维护成本,但策略失效风险依旧来自行情而非界面。 开 MT5 建个空 EA,把文中复选框和列表拖进 OnInit 里的自定义面板,跑一遍就能确认哪些交互还得自己补。

◍ 一点提醒

这套自定义图形控件库以 IncGUI_v2.mqh 为核心,覆盖了从 CSpinInputBox 到 CTable 共 15 类界面元素,配套 16 个 eIncGUI_v2_Test_*.mq5 示例文件,压缩包 custom_graphic_controls_2_mql5.zip 体积 74.24 KB。把头文件丢进 MQL5/Include、示例 EA 丢进 MQL5/Experts,就能在 MT5 里直接编译跑通各控件独立 demo。 调用层级上,CGraphicObjectShell 与 CWorkPiece 是底层壳,CColorSchemes 管配色,其余控件类均继承扩展;想验证某个组件行为,优先开 eIncGUI_v2_Test_All 看全控件同框创建,再单开对应测试文件隔离排查。 外汇与贵金属图表加载这类自定义面板时,高频重绘会加重终端负载,实盘前先在模拟盘观察资源占用;界面逻辑错误不会爆仓但会遮价格,上线前逐控件点一遍交互。

交给小布盯盘看盘口
这些控件里多数交互逻辑小布盯盘的 AIGC 已内置,打开对应品种页即可看到进度与列表呈现,你把重复劳动交给小布,专注决策。

常见问题

可以,默认允许键盘输入,用 SetReadOnly(true) 能禁用,ReadOnly() 可查当前是否只读。
CTable 作为独立类管理行列对象,调用其更新方法重绘即可,具体重绘时机建议放在 OnChartEvent 里节流。
小布盯盘聚焦行情诊断与呈现,不写 MT5 源码,但界面里的列表、进度展示思路与本文控件一致,可对照参考。
CDialer 是纯拨号盘式选择,CDialerInputBox 额外带文本框,允许输入与拨号联动,适合手输加微调的场景。
补了 SetXYDistance、SetXYSize 等同步方法,修了几处拼写错,并加了新配色与多个控件类。