首页 / 交易学院 / 小布知识库 / 用 MQL5 标准库自建图形面板:从 CAppDialog 到可交互控件
用 MQL5 标准库自建图形面板:从 CAppDialog 到可交互控件
🎛️

用 MQL5 标准库自建图形面板:从 CAppDialog 到可交互控件

MQL5 编程 难度 · 进阶 2011 12 分钟阅读
标准库CAppDialog图形面板控件MQL5 界面

想给指标或 EA 做个好看的显示面板,不一定要手写所有绘图。MQL5 标准库提供了一组控件类,基于图表内嵌对象和事件驱动模型,让你用很少代码就能搭出自定义界面:独立子窗口的显示面板、EA 控制面板、自定义监控面板都行。

一、标准库提供了哪些控件

标准库开箱即用的控件分两类。简单控件:带文本/图像的按钮(保证鼠标与程序交互)、文本输入/只读显示、辅助标签、分组控件、装饰控件。复杂控件:列表视图、带下拉的字段、下拉选择、增减字段、枚举值、单选按钮、复选框、选项组、标志编辑组。这些足以拼出绝大多数交易面板。

二、显示面板是什么

“显示面板”指没有任何绘图缓冲区的独立窗口,只用图表内嵌对象显示信息:数值、文本、颜色。它常放在独立图表子窗口里。相比把信息画进指标缓冲,面板更灵活、能放交互控件,适合做“监控 + 操作”二合一的界面。

三、两个文件:类描述 + 指标

建一个面板需要两个文件:包含文件(描述面板对话框类,如 PanelDialog.mqh)和指标源文件(PanelIndicator.mq5)。可用 MQL5 向导生成模板:在 Indicators 目录下新建 MyIndicators 文件和 MyPanel 子文件夹,向导里选 New Class 生成类骨架,再选 Custom Indicator 生成指标骨架。

// PanelDialog.mqh 类骨架(节选)
#include <Controls\Dialog.mqh>
class CPanelDialog : public CAppDialog {
  private:
  public:
    CPanelDialog(void);
    ~CPanelDialog(void);
};

四、指标骨架与对话框挂载

指标用向导生成时,要勾选 OnChartEvent 和 OnTimer,并选“Separate Window Indicator(独立窗口指标)”。在 OnInit 里 Create 对话框、Run 启动应用、EventSetTimer 建定时器;OnDeinit 里 Destroy 并杀定时器;OnChartEvent 把事件转给对话框。编译后拖到图表,会在独立窗口显示为空对话框。

// OnInit:创建并启动对话框
int OnInit() {
  if(!ExtDialog.Create(0,"Panel Indicator",0,0,0,0,130)) return(-1);
  if(!ExtDialog.Run()) return(-2);
  EventSetTimer(1);
  return(0);
}
// OnDeinit:销毁
int OnDeinit() {
  ExtDialog.Destroy();
  EventKillTimer();
  return(0);
}

五、让面板显示信息:三步

面板要显示什么,由三个问题决定:显示哪类信息?加哪些控件?控件怎么交互?文章示例用 RGB 三色阶演示:红随 OnCalculate 随机变、绿随 OnTimer 随机变、蓝用手动微调控件变,并把值显示出来。需要 Panel(颜色)、只读 Edit(红/绿值)、SpinEdit(蓝值)、Label(说明)这些控件。

// 在类里声明附加控件
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Label.mqh>
#include <Controls\SpinEdit.mqh>
class CPanelDialog : public CAppDialog {
  private:
    CPanel    m_color;      // 颜色显示
    CLabel    m_label_red;  // “红”标题
    CEdit     m_field_red;  // “红”数值
    CLabel    m_label_blue; // “蓝”标题
    CSpinEdit m_edit_blue;  // “蓝”微调
    int m_red, m_green, m_blue;
};

六、布局与坐标:缩进常量

控件位置靠一组布局常量约束:INDENT_LEFT/TOP/RIGHT/BOTTOM 是边框缩进,CONTROLS_GAP_X/Y 是控件间距,LABEL_WIDTH/EDIT_WIDTH/EDIT_HEIGHT 是尺寸。所有 Create 方法里按这些常量算坐标,界面就能整齐对齐。掌握这套常量,复刻任意标准库面板布局都不难。

// 布局常量(节选)
#define INDENT_LEFT   (11)
#define INDENT_TOP    (11)
#define INDENT_RIGHT  (11)
#define INDENT_BOTTOM (11)
#define CONTROLS_GAP_X (10)
#define CONTROLS_GAP_Y (10)
#define LABEL_WIDTH   (50)
#define EDIT_WIDTH    (50)
#define EDIT_HEIGHT   (20)
面板控件越多,OnCalculate/OnTimer 越容易成为瓶颈:把重计算放进 OnTimer 而非每根 K 线都重算的 OnCalculate;只读显示用 Edit 的只读模式,避免误改。计时器间隔(EventSetTimer 参数)也要权衡刷新频率与性能。

七、小结

用标准库自建面板,核心是“两个文件 + 一套控件类”:PanelDialog.mqh 描述界面、PanelIndicator.mq5 挂载并驱动。CAppDialog 管对话框生命周期,具体控件(Panel/Edit/Label/SpinEdit)在 Create 里按布局常量摆好,事件经 OnChartEvent 流入。它比手写 Canvas 绘制省事太多,是做 EA 控制面板、监控面板的首选起点。

常见问题

标准库(CAppDialog + Controls\*)更系统、控件更全、与 MQL5 向导集成好,适合从零搭复杂面板;IncGUI 的表单(CFormBase/CFormTemplate)更轻、聚焦“窗口容器+控件同步”,适合把已有控件打包成窗口。两者思路相通,会一个另一个也容易上手。
普通指标把数据画进指标缓冲区(线/柱/色块),没有交互;显示面板是独立子窗口里用图表对象(Panel/Edit/Label 等控件)显示信息,可放按钮、输入框、微调器并响应点击。面板适合“监控+操作”合一,指标适合“纯可视化”。
所有鼠标/键盘事件都走 OnChartEvent。指标或 EA 里把 OnChartEvent 收到的事件重定向给对话框(如 ExtDialog 的对应处理),标准库控件内部再分发给具体控件。你只需在控件里挂好回调逻辑,不用自己解析原始坐标。
CPanelDialog 继承 CAppDialog。CAppDialog 是标准库提供的应用对话框基类,管创建/运行/销毁和事件框架;CPanelDialog 是你写的子类,在私有区加具体控件(Panel/Edit/Label 等),并在 Create 里调用各控件的 Create 完成界面组装。
显示面板通常作为“独立窗口指标”(separate window indicator)放在子窗口;也可用对话框类做浮在主图上的面板(EA 控制面板常见做法)。放哪取决于你用 Custom Indicator 还是 EA + CAppDialog——前者在子窗口,后者可浮在主图上方。