消息对话框

MQL5 API 提供了 MessageBox 函数,用于以交互方式提示用户确认操作或选择用于处理特定情况的选项。

int MessageBox(const string message, const string caption = NULL, int flags = 0)

该函数打开一个具有给定消息 (message)、标题 (caption) 和设置 (flags) 的无模式对话框。该窗口保持在主终端窗口上面可见,直至用户单击可用按钮之一将其关闭(参见下文)。

该消息同时也以 "Message" 标记显示在“专家”日志中。

如果 caption 参数为 NULL,则 MQL 程序的名称被用作标题。

flags 参数必须包含一个位标志与一个 OR ('|') 运算的组合。支持标志的总集合分为 3 组,分别定义了:

  • 对话框中的一组按钮
  • 对话框中的图标图像
  • 默认选中的活动按钮

下表列出了用于定义对话框按钮的常量和标志值。

常量

说明

MB_OK

0x0000

1 个“确定”按钮(默认)

MB_OKCANCEL

0x0001

2 个按钮:“确定”和“取消”

MB_ABORTRETRYIGNORE

0x0002

3 个按钮:“终止”、“重试”和“忽略”

MB_YESNOCANCEL

0x0003

3 个按钮:“是”、“否”和“取消”

MB_YESNO

0x0004

2 个按钮:“是”和“否”

MB_RETRYCANCEL

0x0005

2 个按钮:“重试”和“取消”

MB_CANCELTRYCONTINUE

0x0006

3 个按钮:“取消”、“再试一次”和“继续”

下表列出了可用图像(显示在消息左边)

常量

说明

MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND

0x0010

“停止”符号

错误图标

MB_ICONQUESTION

0x0020

问号

问题图标

MB_ICONEXCLAMATION
MB_ICONWARNING

0x0030

感叹号

警告图标

MB_ICONINFORMATION
MB_ICONASTERISK

0x0040

信息符号

信息图标

所有图标取决于操作系统版本。你的计算机上显示的示例可能不同。

以下值保留用于选择活动按钮。

常量

说明

MB_DEFBUTTON1

0x0000

第一个按钮,即默认按钮(如果未选择任何其它常量)

MB_DEFBUTTON2

0x0100

第二个按钮

MB_DEFBUTTON3

0x0200

第三个按钮

MB_DEFBUTTON4

0x0300

第四个按钮

你可能会有疑问,如果上面的常量只允许你设置不超过三个按钮,那么这第四个按钮是怎么回事。事实是,在标志当中还有 MB_HELP (0x00004000)。该标志指示在对话框中显示“帮助”按钮。这样,如果有三个主按钮,“帮助”按钮会变成一排中的第四个。然而,与其它按钮不同,单击“帮助”按钮不会关闭对话框。根据 Windows 标准,帮助文件可与程序关联,当按下“帮助”按钮时,应该打开必要的帮助信息。然而,MQL 程序目前不支持这一技术。

该函数根据对话框被关闭的方式(按了哪个按钮)而返回其中一个预定义值。

常量

说明

IDOK

1

“确定”按钮

IDCANCEL

2

“取消”按钮

IDABORT

3

“终止”按钮

IDRETRY

4

“重试”按钮

IDIGNORE

5

“忽略”按钮

IDYES

6

“是”按钮

IDNO

7

“否”按钮

IDTRYAGAIN

10

“再试一次”按钮

IDCONTINUE

11

“继续”按钮

如果消息框有“取消”按钮,则在用户按 ESC 键时(除了“取消”按钮之外),该函数返回 IDCANCEL。如果消息框没有“取消”按钮,则按 ESC 无效果。

调用 MessageBox 会暂停当前 MQL 程序的执行,直至用户关闭对话框。因此,MessageBox指标中禁止使用,因为指标是在终端的接口线程中执行,等待用户回应将会拖慢图表的更新。

同样,该函数也不能用在 服务中,因为它们与用户界面无关联,而其它类型的 MQL 程序是在图表上下文中执行。

在策略测试程序中运行时,MessageBox 函数没有效果并返回 0。

从函数调用获得结果之后,你可以以你想要的方式处理结果,例如:

   int result = MessageBox("Continue?"NULLMB_YESNOCANCEL);
 // use 'switch' or 'if' as needed
   switch(result)
   {
   case IDYES:
     // ...
     break;
   case IDNO:
     // ...
     break;
   case IDCANCEL:
     // ...
     break;
   }

MessageBox 函数可以使用 OutputMessage.mq5 脚本测试,用户可使用输入变量选择对话框的参数,并实际观察其效果。

按钮、图标和默认选定按钮的设置组以及返回代码在特殊枚举中描述:ENUM_MB_BUTTONS、ENUM_MB_ICONS、ENUM_MB_DEFAULT、ENUM_MB_RESULT。这通过下拉列表提供可视化输入,并使用 EnumToString 简化了它们向字符串的转换。

例如,下面是前两个枚举的定义方式。

enum ENUM_MB_BUTTONS
{
   _OK = MB_OK,                                      // Ok
   _OK_CANCEL = MB_OKCANCEL,                         // Ok | Cancel
   _ABORT_RETRY_IGNORE = MB_ABORTRETRYIGNORE,        // Abort | Retry | Ignore
   _YES_NO_CANCEL = MB_YESNOCANCEL,                  // Yes | No | Cancel
   _YES_NO = MB_YESNO,                               // Yes | No
   _RETRY_CANCEL = MB_RETRYCANCEL,                   // Retry | Cancel
   _CANCEL_TRYAGAIN_CONTINUE = MB_CANCELTRYCONTINUE// Cancel | Try Again | Continue
};
   
enum ENUM_MB_ICONS
{
   _ICON_NONE = 0,                                  // None
   _ICON_QUESTION = MB_ICONQUESTION,                // Question
   _ICON_INFORMATION_ASTERISK = MB_ICONINFORMATION// Information (Asterisk)
   _ICON_WARNING_EXCLAMATION = MB_ICONWARNING,      // Warning (Exclamation)
   _ICON_ERROR_STOP_HAND = MB_ICONERROR,            // Error (Stop, Hand)
};

其余可以在源代码中找到。

然后它们被用作输入变量类型(元素注释在用户界面中提供更为用户友好的呈现方式)。

input string Message = "Message";
input string Caption = "";
input ENUM_MB_BUTTONS Buttons = _OK;
input ENUM_MB_ICONS Icon = _ICON_NONE;
input ENUM_MB_DEFAULT Default = _DEF_BUTTON1;
   
void OnStart()
{
   const string text = Message + "\n"
      + EnumToString(Buttons) + ", "
      + EnumToString(Icon) + ","
      + EnumToString(Default);
   ENUM_MB_RESULT result = (ENUM_MB_RESULT)
      MessageBox(textStringLen(Caption) ? Caption : NULLButtons | Icon | Default);
   Print(EnumToString(result));
}

该脚本在窗口中显示指定消息以及指定对话框设置。对话框结果显示在日志中。

下图显示了选项选择界面和生成对话框的截屏。

“窗口特性”对话框

“窗口特性”对话框

“接收到的消息”对话框

“接收到的消息”对话框