Code: Select all
// Вырезано всё оставив чекбокс... из скрипта-примера CreateDialog.js от KDJ
//
//
// Требуется в папке include: CreateDialog_functions.js
var oSys = AkelPad.SystemFunction();
var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + AkelPad.GetInstanceDll(); // придумываем имя класса окна
var hDlg = oSys.Call("User32::FindWindowW", sClass, 0); // Ищем это окно, FindWindowW возвращает дескриптор
if (hDlg) // Если окно с указанным классом найдено, то
{
if (! oSys.Call("User32::IsWindowVisible", hDlg)) // если окно невидимое, то
oSys.Call("User32::ShowWindow", hDlg, 8 /*SW_SHOWNA*/); // делаем видимым
if (oSys.Call("User32::IsIconic", hDlg)) // если окно свёрнуто, то
oSys.Call("User32::ShowWindow", hDlg, 9 /*SW_RESTORE*/); // разворачиваем
oSys.Call("User32::SetForegroundWindow", hDlg); // делаем окно активным
}
else if (AkelPad.Include("CreateDialog_functions.js")) // иначе (если окно не найдено) если существует необходимый скрипт, то
{
var hIcon = oSys.Call("User32::LoadImageW", AkelPad.GetInstanceDll(), 101, 1 /*uType=IMAGE_ICON*/, 0, 0, 0x40 /*LR_DEFAULTSIZE*/); // загружает иконку, возвращая дескриптор
var nCounter = 0; // счётчик диалоговых окон
// var IDCANCEL = 2; // Exit в меню
var IDCHECKB = 2001; // идентификатор чекбокса
if (AkelPad.WindowRegisterClass(sClass)) // если класс зарегистрирован
{
// Разрешить запуск других скриптов
AkelPad.ScriptNoMutex();
CreateDialog(false, true, AkelPad.GetMainWnd()); // Функция создания окна
AkelPad.WindowUnregisterClass(sClass); // разрегестрировать класс после закрытия окна, то есть по завершении предыдущей функции
}
oSys.Call("user32::DestroyIcon", hIcon); // Удалить дескриптор значка, освободив ресурсы
}
function CreateDialog(bBox, bModeless, hParent)
{
var nTimerID = ++nCounter;
var aDlg = [];
var nResult;
var hFocus;
aDlg.Modeless = bModeless;
aDlg.Title = "[" + nTimerID + "] " + (bBox ? "Dialog box " : "Dialog window ") + (bModeless ? "modeless" : "modal"); // Заголовок окна
aDlg.Style = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; // Стиль окна
aDlg.Parent = hParent; // Родитель окна (блокировать доступ к родителю или закрывать при закрытии родителя)
aDlg.Callback = DialogCallback; // Имя функции обратного вызова принимающая события окна
aDlg.Icon = hIcon; // дескриптор иконки окна ранее полученный
aDlg.X = 20; // X-координата окна
aDlg.W = 650; // ширина окна
aDlg.H = 432; // высота окна
aDlg.PosPar = 3;
aDlg.CtlFirst = IDCHECKB; // первый элемент управления
aDlg.CtlStyle = WS_VISIBLE;
if (bBox) // если флаг бокс-окно
{
aDlg.PosPix = true;
aDlg.CtlFontN = "MS Shell Dlg";
}
else
{
aDlg.Class = sClass;
aDlg.SizeClt = true;
aDlg.CtlFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
}
// Задаёт характеристики чекбокс (положения и размеров, текст, стиль), чтобы потом создать функцией InitDialog()
aDlg[IDCHECKB] = {X: 20, Y: 30, W: 110, H: 16, Title: "Чекбокс, кликни", Style: WS_TABSTOP | BS_AUTOCHECKBOX};
if (bBox)
{
if (bModeless)
{
if (CreateDialogBox(aDlg))
{
if (nTimerID == 1)
AkelPad.WindowGetMessage(0x2 /*WGM_NOKEYSEND*/);
}
}
else
{
nResult = CreateDialogBox(aDlg);
}
}
else
{
if (CreateDialogWindow(aDlg, 1))
{
if (! bModeless)
oSys.Call("user32::EnableWindow", aDlg.Parent, 0);
if (nTimerID == 1)
AkelPad.WindowGetMessage(0x2 /*WGM_NOKEYSEND*/);
}
}
// Функция обратного вызова принимающая события
function DialogCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 1 /*WM_CREATE*/) // если пришло сообщение о создании окна
{
aDlg.HWND = hWnd; // Дописываем дексриптор
CreateDialogWindow(aDlg, 2, hWnd);
InitDialog(); // Формирует элементы в окне
hFocus = aDlg[IDCHECKB].HWND; // Указываем дескриптор в фокусе
}
else if (uMsg == 272 /*WM_INITDIALOG*/)
InitDialog(); // Формирует элементы в окне
else if ((uMsg == 6 /*WM_ACTIVATE*/) && (wParam == 0 /*WA_INACTIVE*/) && (! bBox)) // если пришло сообщение что окно стало активным, то
hFocus = oSys.Call("User32::GetFocus"); // Получить дескриптор элемента управления, имеющий фокус
else if ((uMsg == 7 /*WM_SETFOCUS*/) && (! bBox))
oSys.Call("User32::SetFocus", hFocus); // Устанавливаем фокус указанному дескриптору элемента управления
if ((uMsg == 78 /*WM_NOTIFY*/) && 0) // если пришло уведомление от окна (добавил "&& 0", чтобы заблокировать)
{
if (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), 3 /*DT_DWORD*/) == -2 /*NM_CLICK*/) // если событие клика
{
if (wParam == IDLW) // Если события от ссылки (уже не придёт)
{
AkelPad.SendMessage(aDlg[IDSBAR].HWND, 5 /*WM_SIZE*/, 0, 0); // статус бару сообщение что окно изменило размер
}
}
}
else if (uMsg == 273 /*WM_COMMAND*/) // Сообщение выполняется при клике на элементах окна
{
var nLowParam = LoWord(wParam); // младшее слово содержит ID элемента управления
if (nLowParam == IDCHECKB) // если событие клик на чекбоксе, то
AkelPad.MessageBox(hWnd, 'Клик на чекбоксе, состояние = ' + AkelPad.SendMessage(aDlg[IDCHECKB].HWND, 240 /*BM_GETCHECK*/, 0, 0), aDlg.Title, 0x40 /*MB_ICONINFORMATION*/);
// else if (nLowParam == IDCANCEL) // если событие IDCANCEL (Exit в меню), то
// oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, nLowParam, 0); // высылаем окну команду закрытия
}
else if ((uMsg == 275 /*WM_TIMER*/) && 0) // если событие по таймеру (добавил "&& 0", чтобы заблокировать)
{
AkelPad.SendMessage(aDlg[IDPB].HWND, 1029 /*PBM_STEPIT*/, 0, 0); // шаг прогресса
SetTextSBAR(AkelPad.SendMessage(aDlg[IDPB].HWND, 1032 /*PBM_GETPOS*/, 0, 0));
}
else if (uMsg == 16 /*WM_CLOSE*/) // если событие закрытия окна, то
{
if ((! bBox) && (! bModeless))
{
oSys.Call("user32::EnableWindow", aDlg.Parent, 1);
oSys.Call("User32::SetForegroundWindow", aDlg.Parent);
}
if (bBox && (! bModeless))
oSys.Call("User32::EndDialog", hWnd, wParam);
else
oSys.Call("User32::DestroyWindow", hWnd);
}
else if (uMsg == 2 /*WM_DESTROY*/) // если событие уничтожения окна, то
{
if (nTimerID == 1)
oSys.Call("User32::PostQuitMessage", 0);
}
return 0;
}
function InitDialog()
{
var i;
//Button
AkelPad.SendMessage(aDlg[IDCHECKB].HWND, 241 /*BM_SETCHECK*/, 1 /*BST_CHECKED*/, 0);
}
}
// вытаскивает младшее слово из двойного слова
function LoWord(nDwNum)
{
return nDwNum & 0xFFFF;
}