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; // счётчик диалоговых окон
// Константы ID элементов управления окна
var ID_CHECKB = 2001; // идентификатор чекбокса
var ID_GROUPE = 2002; // линия группирования элементов
var ID_INP = 2003; // поле ввода
var ID_BTN_OK = 2004; // кнопка ОК
var ID_CANCEL = 2005; // кнопка отмена
var ID_LABEL = 2006; // Надпись над полем ввода
var IDTB = 2007;
if(AkelPad.WindowRegisterClass(sClass)) // если класс зарегистрирован
{
// Разрешить запуск других скриптов
AkelPad.ScriptNoMutex();
CreateDialog(false, false, 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 = "Настройки"; // Заголовок окна
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 = 270; // ширина окна
aDlg.H = 180; // высота окна
aDlg.PosPar = 3;
aDlg.CtlFirst = ID_CHECKB; // первый элемент управления
aDlg.CtlStyle = WS_VISIBLE;
// если флаг бокс-окно
aDlg.PosPix = true;
aDlg.CtlFontN = "MS Shell Dlg";
// Масив элементов управления окна
// Задаёт характеристики каждого (положение и размеры, текст, стиль), чтобы потом создать функцией InitDialog()
aDlg[ID_GROUPE] = {
X: 10,
Y: 10,
W: 150,
H: 95,
Title: "Сгруппированные",
Style: BS_GROUPBOX | BS_CENTER
};
aDlg[ID_LABEL] = {
X: 20,
Y: 30,
W: 80,
H: 13,
Title: "Введи текст",
Class: "STATIC"
};
aDlg[ID_INP] = {
X: 20,
Y: 50,
W: 120,
H: 20,
Title: "какой то текст",
Class: "EDIT",
Style: WS_TABSTOP | WS_BORDER
};
aDlg[ID_CHECKB] = {
X: 20,
Y: 80,
W: 110,
H: 16,
Title: "Чекбокс",
Style: WS_TABSTOP | BS_AUTOCHECKBOX
};
aDlg[ID_BTN_OK] = {
X: 20,
Y: 110,
W: 60,
H: 23,
Title: "OK",
Style: WS_TABSTOP | BS_PUSHBUTTON
};
aDlg[ID_CANCEL] = {
X: 90,
Y: 110,
W: 60,
H: 23,
Title: "Отмена",
Style: WS_TABSTOP | BS_PUSHBUTTON
};
aDlg[IDTB] = {
X: 20,
Y: 140,
W: 210,
H: 30,
Class: "msctls_trackbar32",
Style: WS_TABSTOP | TBS_AUTOTICKS
};
// если флаг бокс-окно
nResult = CreateDialogBox(aDlg);
// Функция обратного вызова принимающая события
function DialogCallback(hWnd, uMsg, wParam, lParam) {
if(uMsg == 1 /*WM_CREATE*/ ) // если пришло сообщение о создании окна
{
aDlg.HWND = hWnd; // Дописываем дексриптор
CreateDialogWindow(aDlg, 2, hWnd);
InitDialog(); // Задаёт начальное состояние элементов в окне
hFocus = aDlg[ID_CHECKB].HWND; // Указываем дескриптор в фокусе
}
switch(uMsg) { // сравнение ==
case 272 /*WM_INITDIALOG*/ :
InitDialog(); // Задаёт начальное состояние элементов в окне
break;
case 276 /*WM_HSCROLL */ : // уведомление прокрутки
var nLowParam = LoWord(wParam); // младшее слово содержит ID элемента управления
var nHiwParam = HiWord(wParam); // младшее слово содержит ID элемента управления
// WScript.Echo("HWND =" + aDlg[IDTB].HWND + " " + lParam); // проходит
switch(lParam) { // если дексриптор равен
case aDlg[IDTB].HWND: // декскриптору слайдера
switch(nLowParam) { // уведомление
case 0: // SB_LINELEFT - клавишами, влево, аналогично для ниже следующих
case 1: // SB_LINERIGHT
case 2: // SB_PAGELEFT
case 3: // SB_PAGERIGHT
var nPos = AkelPad.SendMessage(aDlg[IDTB].HWND, 1024 /*TBM_GETPOS*/ , 0, 0); // чтение позиции со слайдера
var sText = nPos + "";
oSys.Call("User32::SetDlgItemTextW", hWnd, ID_INP, sText);
break;
case 4: // SB_THUMBPOSITION - колесом мыши
case 5: // SB_THUMBTRACK - стрелкой мыши
// WScript.Echo("nHiwParam = " + nHiwParam); // проходит
var sText = nHiwParam + "";
oSys.Call("User32::SetDlgItemTextW", hWnd, ID_INP, sText);
// AkelPad.Call("Coder::HighLight", 2, "#FFFFFF", "#" + sText + "4E52", 0, 0, 999) // кривой пример изменения цвета выделенного
// var nPos = SendMessage(lParam, 1024 /*TBM_GETPOS*/, 0, 0);
// WScript.Echo("nHiwParam = " + AkelPad.SendMessage(aDlg[IDTB].HWND, 1024 /*TBM_GETPOS*/ , 0, 0)); // проходит
break;
}
break;
}
break;
case 273 /*WM_COMMAND*/ :
var nLowParam = LoWord(wParam); // младшее слово содержит ID элемента управления
// var nHiwParam = HiWord(wParam); // младшее слово содержит ID элемента управления
switch(nLowParam) { //сравнение ==
case ID_BTN_OK: // событие нажатия "ОК", стандартно считываем параметры, чтобы использовать в дальнейшем
// if (nHiwParam == 0)
// Блок для чтения из поля ввода
var nEditLen = 32767; // число символов с запасом для поля ввода
var lpEdit = AkelPad.MemAlloc((nEditLen + 1) * 2); // Выделяем память и получаем указатель
oSys.Call("User32::GetDlgItemTextW", hWnd, ID_INP, lpEdit, nEditLen); // Высылает текст поля ввода в указатель
var sText_input = AkelPad.MemRead(lpEdit, 1 /*DT_UNICODE*/ ); // Читаем с указателя
AkelPad.MemFree(lpEdit); // Освобождаем память
var CheckboxState = AkelPad.SendMessage(aDlg[ID_CHECKB].HWND, 240 /*BM_GETCHECK*/ , 0, 0) // получаем состояние чекбокса
AkelPad.MessageBox(hWnd, 'Чекбокс = ' + CheckboxState + '\n\n Поле ввода: ' + sText_input, 'Результат', 0x40 /*MB_ICONINFORMATION*/ );
break;
case ID_CANCEL: // кнопка отмены вызылает окну команду закрытия
oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/ , nLowParam, 0);
break;
// case ID_CHECKB: // если событие клик на чекбоксе, то есть активно изменить что-либо сразу в окне
// break;
}
break;
case 16 /*WM_CLOSE*/ : // если событие закрытия окна, то
oSys.Call("User32::EndDialog", hWnd, wParam);
break;
case 2 /*WM_DESTROY*/ : // если событие уничтожения окна, то
if(nTimerID == 1)
oSys.Call("User32::PostQuitMessage", 0);
break;
}
return 0;
}
function InitDialog() {
var i;
// Ставит галочку в CheckBox
AkelPad.SendMessage(aDlg[ID_CHECKB].HWND, 241 /*BM_SETCHECK*/ , 1 /*BST_CHECKED*/ , 0);
//TrackBar
AkelPad.SendMessage(aDlg[IDTB].HWND, 1044 /*TBM_SETTICFREQE*/ , 10, 0);
AkelPad.SendMessage(aDlg[IDTB].HWND, 1029 /*TBM_SETPOS*/ , 1, 33);
}
}
// вытаскивает младшее слово из двойного слова
function LoWord(nDwNum) {
return nDwNum & 0xFFFF;
}
// вытаскивает старшее слово из двойного слова
function HiWord(nDwNum) {
return(nDwNum >> 16);
}