Маленький комментарий ко второму варианту модального окна согласно Wamr (с помощью MessageBox). Передо мной встала задача создать такое модальное окно, при котором бы в Axapty не посылалось бы вообще никаких сообщений. Стандарно так ведет себя только Box::stop(), но в этом варианте диалога только одна кнопка. Вот код, который эмулирует аксартовский DialogBox, причем создает диалоги, полностью блокирующие окно Аксапты:
PHP код:
//int MessageBox(
// HWND hWnd, // handle to owner window
// LPCTSTR lpText, // text in message box
// LPCTSTR lpCaption, // message box title
// UINT uType, // message box style
DialogButton systemMessageBox(
str _text,
DialogBoxType _dialogBoxType,
str _title = "@SYS11132",
DialogButton _defaultButton = DialogButton::Ok,
boolean _taskModal = false,
int _hWnd = activeFormRun ? activeFormRun.hWnd() : 0)
{
DLL user32DLL = new DLL("USER32");
DLLFunction messageBox = new DLLFunction(user32DLL, "MessageBoxA");
int uType = 0, ret, xhWnd = _hWnd;
DialogButton retButton;
messageBox.returns(ExtTypes:: DWord);
messageBox.arg(ExtTypes:: DWORD,
ExtTypes::String,
ExtTypes::String,
ExtTypes:: DWORD);
switch(_dialogBoxType)
{
case DialogBoxType::InfoBox :
uType = #MB_OK | #MB_ICONINFORMATION;
break;
case DialogBoxType::OkCancelBox :
uType = #MB_OKCANCEL | #MB_ICONWARNING;
uType = _defaultButton == DialogButton::Ok ? uType | #MB_DEFBUTTON1 :
uType | #MB_DEFBUTTON2;
break;
case DialogBoxType::StopBox :
uType = #MB_OK | #MB_ICONSTOP;
break;
case DialogBoxType::WarnBox :
uType = #MB_OK | #MB_ICONWARNING;
break;
case DialogBoxType::YesNoBox :
uType = #MB_YESNO | #MB_ICONWARNING;
uType = _defaultButton == DialogButton::Yes ? uType | #MB_DEFBUTTON1 :
uType | #MB_DEFBUTTON2;
break;
case DialogBoxType::YesNoCancelBox :
uType = #MB_YESNOCANCEL | #MB_ICONWARNING;
uType = _defaultButton == DialogButton::Yes ? uType | #MB_DEFBUTTON1 :
(_defaultButton == DialogButton::No ? uType | #MB_DEFBUTTON2 :
uType | #MB_DEFBUTTON3);
break;
case DialogBoxType::NoToAllBox,
DialogBoxType::YesToAllBox,
DialogBoxType::YesToAllNoToAllBox :
default :
uType = #MB_YESNO | #MB_ICONINFORMATION;
}
if (_taskModal)
{
uType = uType | #MB_TASKMODAL;
xhWnd = 0;
}
/* --> */ ret = messageBox.call(xhWnd, _text, _title, uType);
switch(ret)
{
case #IDOK, #IDRETRY, #IDIGNORE :
retButton = DialogButton::Ok;
break;
case #IDCANCEL, #IDABORT, #IDCLOSE :
retButton = DialogButton::Cancel;
break;
case #IDYES, #IDHELP :
retButton = DialogButton::Yes;
break;
case #IDNO :
default :
retButton = DialogButton::No;
break;
}
return retButton;
}