Скачать MetaTrader 5

Вопрос о MessageBox()

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MQL5 Cloud Network ускоряет расчеты. Попробуй сам!
Alexey Viktorov
6923
Alexey Viktorov 2012.02.07 06:29 

Можно-ли и, если да то как, задать время ожидания нажатия кнопки?

Т.е. если пользователь не отреагировал на окно сообщений в течении Х секунд, то закрыть его. Естественно назначив при этом код возврата функции.

Vadim Zhunko
5226
Vadim Zhunko 2012.02.07 09:22  

Есть недокументированная функция MessageBoxTimeout().

Она это может.

Rorschach
717
Rorschach 2012.02.07 09:40  
Zhunko:

Есть недокументированная функция MessageBoxTimeout().

Она это может.


Где можно узнать о других недокументированных ф-ях?
Alexey Viktorov
6923
Alexey Viktorov 2012.02.07 10:00  
Zhunko:

Есть недокументированная функция MessageBoxTimeout().

Она это может.


Будь добр, покажи пример её использования.

Если не нажата ни-одна кнопка в течении Х секунд - код возврата функции = IDYES

Vadim Zhunko
5226
Vadim Zhunko 2012.02.07 10:46  
AlexeyVik:

Будь добр, покажи пример её использования.

Если не нажата ни-одна кнопка в течении Х секунд - код возврата функции = IDYES

Всё тоже, что с MessageBox(). Только последний параметр указывает сколько миллисекунд будет висеть окно.

Не так всё просто. Эту функцию из MQL4 не просто вызвать. Её нет в заголовочном файле user32.dll.

В С++, чтобы не возиться с динамической загрузкой DLL, я её дописал в инклюд стандартный. Что не рекомендуется.

Проще DLL свою написать с разными диалоговыми окнами, чем в MQL4 с этим возиться.

Хотя, попробуте дописать в инклюд winuser32.mqh эту функцию и вызвать. Интересно, получится ли... Пример у меня в С++:

    // 1.3.1. Функция создаёт окно с сообщением и выводит в него любое число. Окно имеет значёк (i). Окно закрывается через указанное количество секунд.
    template <typename type>
    void MessageBoxInfo(const tstring &sWindowTitle,  // Заголовок окна.
                        const type     tNumber,       // Сообщение для вывода в окно.
                        const DWORD    dwSeconds = 0) // Количество секунд до закрытия окна.
     {
      tstringstream ssMessage;
      ssMessage << tNumber;
      ::MessageBoxTimeout(NULL, ssMessage.str().c_str(), sWindowTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_DEFBUTTON1|MB_TASKMODAL|MB_SETFOREGROUND|MB_TOPMOST, NULL, 1000 * dwSeconds);
     }
Alexey Viktorov
6923
Alexey Viktorov 2012.02.07 11:52  
Спасибо. Буду пробовать, но для меня такая заморочка сложновата.
Vadim Zhunko
5226
Vadim Zhunko 2012.02.07 12:53  
Rorschach:

Где можно узнать о других недокументированных ф-ях?
Как-то специально не занимался этим. Можно в инете поискать инфу поисковиком. Обычно, что-то надо и натыкаешься на то, что искал и применяешь.
Alexey Navoykov
3988
Alexey Navoykov 2012.02.07 15:21  

Сейчас попробовал, в MQL4 эта недокументированная функция вызывается без проблем. Вот рабочий пример:

#include <WinUser32.mqh>

#import "user32.dll"
  int MessageBoxTimeoutA(int hWnd, string lpText, string lpCaption, int uType, int wLanguageId, int dwMilliseconds); 

int start()
{ 
  int result=MessageBoxTimeoutA(0,"Are you ok?","Caption",MB_YESNO,0,1000);
  Print(result);
}
Vadim Zhunko
5226
Vadim Zhunko 2012.02.07 16:09  

Отлично!

Добавил её в свой WinUser32.mqh. Выложу со следующими обновлениями своих программ в копилке.

Получается, что WinUser32.mqh для MQL4 является таким же заголовочным файлом, как winuser.h для С++. Напрямую в либу MQL4 направляет.

Alexey Viktorov
6923
Alexey Viktorov 2012.02.08 04:28  
Meat:

Сейчас попробовал, в MQL4 эта недокументированная функция вызывается без проблем. Вот рабочий пример:


Спасибо, работает. Только пришлось заменить MB_YESNO на 0x00000004 Набор других кнопок в справке по MessageBox они совпадают.

Дальше условие if(result != 6) Print("Кнопка да не нажата");

Alexey Viktorov
6923
Alexey Viktorov 2012.02.08 08:23  

Какие-то загадки в МТ4, пробовал в отдельном советнике - результат выше.

Сейчас вставил в рабочий советник, работает и с флагами MB_YESNO|MB_ICONQUESTION и IDYES и даже если откомпилировать и перенести на другой комп то работает в таком варианте.

#include <WinUser32.mqh>
#import "user32.dll"

int start()
{ 
  int result = MessageBoxTimeoutA(0, "Are you ok?", "Caption",MB_YESNO|MB_ICONQUESTION, 0, 10000);
  if(result != IDYES) Print("Кнопка да не нажата");
}
Вобщем спасибо за помощь.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий