自定义图形控件(一):在 MQL5 中造可复用控件
一、为什么标准控件不够用
MQL5 标准库(Standard Library)自带按钮、编辑框、列表等控件,足够做普通面板。但当你要做自定义仪表盘、K 线标注、仓位热力图时,标准控件就不够了。理解控件体系,才能知道'什么时候用现成、什么时候自己画'。
二、控件体系的基类:CControl 与 CWindow
所有控件都继承自 CControl,它定义了位置、大小、可见性、事件等通用行为。CWindow 是最顶层的容器控件,负责承载标题栏、客户区和子控件。你写的面板通常先建一个 CWindow,再把其它控件 Add 进去。
三、输入类控件:CEdit 与 CComboBox
CEdit 接收文本/数字输入,CComboBox 是下拉选择。两者都通过 GetText/SetText 取值赋值,并在内容变化时抛出事件。做参数面板时,手数、魔术码、滑点这些输入就靠它们。
四、按钮与勾选:CButton 与 CCheckBox
CButton 触发点击动作(如'一键平仓'),CCheckBox 表达开关状态(如'允许追单')。它们是最常用的交互入口,点击事件在 OnEvent 里按控件 ID 区分处理。
五、列表与表格:CListView 与 CTable
CListView 适合展示持仓/订单列表,CTable 适合多列数据(如回测参数矩阵)。数据更新时调用对应的 Add/Update/Delete 方法,控件会自动重绘。
- CListView:单列可选项,轻量。
- CTable:多列表格,支持排序与单元格操作。
- 两者都需手动维护数据源与视图同步。
六、Canvas 自绘:当标准控件都救不了你
Canvas 类提供像素级绘制(线、矩形、文字、图片)。仪表盘、资金曲线、自定义图表标注都靠它。代价是要自己处理重绘、坐标和命中检测——这也是下篇'自建控件'要解决的。
七、事件路由:点击怎么传到你的 EA
面板收到的鼠标/键盘事件先在 CWindow 分发,再按控件 ID 路由到对应处理函数。你在 EA 的 OnChartEvent 里拿到 id、lparam、dparam、sparam,再用控件 ID 判断'是谁被点了、做了什么'。理解这条链路,自定义交互才不会乱。
八、控件选型速查
- 要用户输入文字或数字 → CEdit。
- 要用户从固定列表选择 → CComboBox。
- 要触发一个动作(如一键平仓) → CButton。
- 要表达开关选项(如允许追单) → CCheckBox。
- 要展示持仓或订单列表 → CListView。
- 要多列数据表格(如回测参数矩阵) → CTable。
- 要像素级自绘仪表盘、资金曲线、K 线标注 → Canvas。
九、与标准库版本
MQL5 标准库控件会随终端版本升级,方法名偶尔变动。写面板时锁定你测试过的标准库版本,升级终端后回归一遍事件路由;自定义控件因为只依赖 CControl 基类接口,反而比直接调内部函数更稳。
十、小结
MQL5 控件体系以 CControl 为基、CWindow 为容器,标准控件覆盖输入/按钮/列表等常见需求,Canvas 负责像素级自绘。理解'事件如何从图表路由到控件 ID'这条链路,你就能判断何时用现成控件、何时该自己画——下篇就开始自建一个控件。