Kibor |
Отправлено: 31 Января, 2019 - 06:42:49
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
В этой версии доработка заключалась в реализации возможности создавать функции отвечающие за отлов различных сообщений. Так же появилась возможность создавать свои контролы любого типа и неограниченное количество.
Еще создание окон. Рекомендуется создавать так:
Создание любых своих диалоговых окно с помощью WinApi - Любые диалоговые окна на WinApi
Добавлена функция getmessage
Функции созданные с помощью данного оператора отлавливают все сообщения полученный немодальными диалоговыми окнами Кибор.
Такие как WM_MOUSEMOVE, WM_MENUCOMMAND, WM_LBUTTONDOWN, WM_PAINT, WM_SIZE, WM_COMMAND и остальные другие.
Это позволяет полноценно взаимодействовать с окном и создавать свои контролы, которых нет в окнах созданных с помощью функций Кибор.
Синтаксис:
Цитата: function getmessage(0, WM_LBUTTONDOWN)//Отлавливаем клик левой кнопки мыши
{
beep(2500, 100);
}
Функции getmessage вызывать не надо. Они сами вызываются при получение окном какого то сообщения. В данном случае эта функция сама вызовется если будет произведен клик левой кн мыши в немодальном диалоге Кибор. Для указания диалога в котором отлавливать сообщения и какое сообщение ловить в скобках указываем 2 параметра.
Первый - номер диалога созданного с помощью Немодальные диалоговые окна
Второй - константа или числовое значение кокой нибудь константы, соответствующие типу сообщения на которое надо выполнять код в этой функции.
При получение какого нибудь сообщения становится доступна структура:
Цитата: message.x - координата мыши X
message.y - координата мыши Y
message.wparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message
message.lparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message
Более подробную информацию ищите в интернете по запросам примерно такого плана:
Цитата: Как отловить клик мыши winapi
Добавил функцию gethwnd
Возвращает HWND созданного диалогового окна с помощью createdialog, для использования в WinApi.
Преимущества получение HWND таким образом в том, что он получается в момент вызова сообщения WM_CREATE.
В обработчике этого сообщения надо создавать все нужные контролы.
Ниже приведен пример как с помощью данных функций определяется выбранный пункт меню созданный в немодальном диалоге Кибор, ловятся сообщения перемещения мыши над диалогом, клик левой кнопки мыши и обновление окна. Так же создаются 2 кнопки и всплывающее меню.
CODE:external(INT, "CreateMenu", "CreateMenu", "User32.dll" );
external(INT, "CreatePopupMenu", "CreatePopupMenu", "User32.dll" );
external(INT, "AppendMenu", "AppendMenuA", "User32.dll" );
external(INT, "SetMenuInfo", "SetMenuInfo", "User32.dll" );
external(INT, "SetMenu", "SetMenu", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "TrackPopupMenu", "TrackPopupMenu", "User32.dll" );
//Сожание меню
int MENUINFO[7]={28, 16, 134217728, 0, 0, 0, 0};
int HMENU, HMENU2, HMENU3;
HMENU2=CreatePopupMenu();
AppendMenu(HMENU2, 16, 1, "Новый" );
AppendMenu(HMENU2, 16, 2, "Открыть" );
AppendMenu(HMENU2, 16, 3, "Сохранить" );
AppendMenu(HMENU2, 16, 4, "Сохранить как" );
HMENU3=CreatePopupMenu();
AppendMenu(HMENU3, 16, 5, "Вырезать" );
AppendMenu(HMENU3, 16, 6, "Копировать" );
HMENU=CreateMenu();
AppendMenu(HMENU, 16, HMENU2, "Файл" );
AppendMenu(HMENU, 16, HMENU3, "Правка" );
//Создание всплывающего меню
int vHMENU, vHMENU2, result;
vHMENU=CreatePopupMenu();
AppendMenu(vHMENU, 0, 111, "MessageBox" );
AppendMenu(vHMENU, 0, 222, "Findimage" );
vHMENU2=CreatePopupMenu();
AppendMenu(vHMENU2, 0, 333, "25" );
AppendMenu(vHMENU2, 0, 444, "50" );
AppendMenu(vHMENU2, 0, 555, "75" );
AppendMenu(vHMENU2, 0, 666, "100" );
AppendMenu(vHMENU, 16, vHMENU2, "Прозрачность" );
int b1, b2;
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
while(window ("Диалог")==0)sleep(10);
win w=window ("Диалог");
loop()
{
w=window ("Диалог");
textout(1, w.left, w.top, " Не обновляли ", 0);
sleep(1);
}
function Простая_функция(int x, int y)//В ней пересчитаем на экранные координаты
{
textout(0, x+w.leftclient, y+w.topclient, " "+format(x)+" "+format(y), 1);
}
function getmessage(0, WM_MOUSEMOVE)//Отлавливаем перемещешие мыши над окном
{
Простая_функция(message.x, message.y);//Перейдем в другую функцию
}
function getmessage(0, WM_CREATE)//Создаем контролы при создание окна
{
int hwnd=gethwnd(0);
SetMenuInfo(HMENU, address(#MENUINFO[0]));
SetMenu(hwnd, HMENU);
//Создание кнопок
b1=CreateWindow(0, "BUTTON", "Первая кнопка", 1342177280, 10, 10, 120, 30, hwnd, 0, 0, 0);
b2=CreateWindow(0, "BUTTON", "Ворая кнопка", 1342177280, 10, 50, 120, 30, hwnd, 0, 0, 0);
}
function getmessage(0, WM_COMMAND)
{
if (message.lparam==b1)messagebox ("Первая кнопка");
if (message.lparam==b2)messagebox ("Ворая кнопка");
}
function getmessage(0, WM_MENUCOMMAND)//Отлавливаем клик по пункту меню
{
if (message.lparam==HMENU2)//идентификатор меню "Файл"
{
if (message.wparam==0)messagebox ("Новый");
if (message.wparam==1)messagebox ("Открыть");
if (message.wparam==2)messagebox ("Сохранить");
if (message.wparam==3)messagebox ("Сохранить как");
}
if (message.lparam==HMENU3)//идентификатор меню "Правка"
{
if (message.wparam==0)messagebox ("Вырезать");
if (message.wparam==1)messagebox ("Копировать");
}
}
function getmessage(0, WM_RBUTTONDOWN)//Отлавливаем клик правой кнопки мыши всплывающее меню
{
w=window ("Диалог" );
result=TrackPopupMenu(vHMENU, 256, message.x+w.leftclient, message.y+w.topclient, 0, formatwi(w), 0 ); // вывести меню
if(result==111)messagebox("Выбран пункт MessageBox" );
if(result==222)messagebox("Выбран пункт Findimage" );
if(result==333)transparency(25, w);
if(result==444)transparency(50, w);
if(result==555)transparency(75, w);
if(result==666)transparency(100, w);
}
function getmessage(0, WM_LBUTTONDOWN)//Отлавливаем клик левой кнопки мыши
{
beep(2500, 100);
}
function getmessage(0, 15)//WM_PAINT Отлавливаем обновление окна
{
textout(1, w.left, w.top, " Обновили окно ", 0);
sleep(100);
}
|
|
|
Zireael |
Отправлено: 31 Января, 2019 - 18:48:04
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Пример как добавить меню вызывающееся правой кнопкой мыши (Отобразить)CODE:external(INT, "CreatePopupMenu", "CreatePopupMenu", "User32.dll" );
external(INT, "TrackPopupMenu", "TrackPopupMenu", "User32.dll" );
external(INT, "AppendMenu", "AppendMenuA", "User32.dll" );
win w;
int HMENU, HMENU2, result;
HMENU=CreatePopupMenu();
AppendMenu(HMENU, 0, 111, "MessageBox" );
AppendMenu(HMENU, 0, 222, "Findimage" );
HMENU2=CreatePopupMenu();
AppendMenu(HMENU2, 0, 333, "25" );
AppendMenu(HMENU2, 0, 444, "50" );
AppendMenu(HMENU2, 0, 555, "75" );
AppendMenu(HMENU2, 0, 666, "100" );
AppendMenu(HMENU, 16, HMENU2, "Прозрачность" );
createdialog(0);
showdialog(0, "Диалог",300, 300, 400, 400, 1, 1);
while(window ("Диалог" )==0)sleep(10);
w=window ("Диалог" );
loop()sleep(1);
function getmessage(0, WM_RBUTTONDOWN)//Отлавливаем клик правой кнопки мыши
{
setwindowparam(w);
result=TrackPopupMenu(HMENU, 256, message.x+w.leftclient, message.y+w.topclient, 0, formatwi(w), 0 ); // вывести меню
if(result==111)messagebox("Выбран пункт MessageBox" );
if(result==222)messagebox("Выбран пункт Findimage" );
if(result==333)transparency(25, w);
if(result==444)transparency(50, w);
if(result==555)transparency(75, w);
if(result==666)transparency(100, w);
} |
|
|
Kibor |
Отправлено: 01 Февраля, 2019 - 16:49:34
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Поправил обновление.
Была проблема с отловом всех сообщений.
Теперь ловит все.
Структура теперь содержит 5 переменные
Цитата:
message.hwnd - HWND окна получившего сообщение
message.x - координата мыши X
message.y - координата мыши Y
message.wparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message
message.lparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message
Координаты x и y оконные.
Пример как сделать свои кнопки и отловить нажатие на них
CODE:external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
while(window ("Диалог")==0)sleep(10);
win w=window ("Диалог");
//Создание кнопок
int b1=CreateWindow(0, "BUTTON", "Первая кнопка", 1342177280, 10, 10, 120, 30, formatwi(w), 0, 0, 0);
int b2=CreateWindow(0, "BUTTON", "Ворая кнопка", 1342177280, 10, 50, 120, 30, formatwi(w), 0, 0, 0);
loop()sleep(1);
function getmessage(0, WM_COMMAND)
{
if (message.lparam==b1)messagebox ("Первая кнопка");
if (message.lparam==b2)messagebox ("Ворая кнопка");
}
Так можно добавлять любые контролы и создавать свой интерфейс.
Описание функции CreateWindowExA
Цитата: HWND CreateWindowEx(
DWORD dwExStyle, // улучшенный стиль окна
LPCTSTR lpClassName, // указатель на зарегистрированное имя класса
LPCTSTR lpWindowName, // указатель на имя окна
DWORD dwStyle, // стиль окна
int x, // горизонтальная позиция окна
int y, // вертикальная позиция окна
int nWidth, // ширина окна
int nHeight, // высота окна
HWND hWndParent, // дескриптор родительского или окна владельца
HMENU hMenu, // дескриптор меню или ID дочернего окна
HINSTANCE hInstance, // дескриптор экземпляра прикладной программы
LPVOID lpParam // указатель на данные создания окна
);
Для создания своих контролов ищите информацию как их создавать в WinApi и какие сообщения они генерируют. |
|
|
Zireael |
Отправлено: 01 Февраля, 2019 - 23:07:11
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Пример как добавить checkbox (Отобразить)CODE:external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
while(window ("Диалог")==0)sleep(10);
win w=window ("Диалог");
// создание checkbox
int check[3];
check[0]=CreateWindow(0, "BUTTON", "Галка0", 3+1342177280, 20, 10, 70, 20, formatwi(w), 0, 0, 0);
check[1]=CreateWindow(0, "BUTTON", "Галка1", 3+1342177280, 20, 30, 70, 20, formatwi(w), 0, 0, 0);
check[2]=CreateWindow(0, "BUTTON", "Галка2", 3+1342177280, 20, 50, 70, 20, formatwi(w), 0, 0, 0);
int flag_check[3]={0,1,0}; // флаги для checkbox, 0-не выбрана, 1-выбрана
if(sizearray(check)!=sizearray(flag_check)){messagebox("Размеры массива check и flag_check не совпадают"); goto end;}
// ставим галки, для которых флаг = 1
for(int i=0; i<sizearray(flag_check); i++)
{
if(flag_check[i])
{
sendmessage(WM_LBUTTONDOWN, 0, 0, formatiw(check[i]));
sendmessage(WM_LBUTTONUP, 0, 0, formatiw(check[i]));
flag_check[i]=1;
}
}
textbkcolor(255, 65280);
loop()
{
textout(0, 220, 135, format(flag_check[0]), 1);
textout(1, 220, 155, format(flag_check[1]), 1);
textout(2, 220, 175, format(flag_check[2]), 1);
sleep(10);
}
end:;
function getmessage(0, WM_COMMAND)
{
for(int i=0; i<sizearray(check); i++) // цикл для всех галок
{
if (message.lparam==check[i])
{
if(flag_check[i])flag_check[i]=0; // если галка уже была выбрана, то флаг = 0
else flag_check[i]=1; // иначе флаг = 1
break;
}
}
}
Пример как добавить radiobox (Отобразить)CODE:external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
while(window ("Диалог")==0)sleep(10);
win w=window ("Диалог");
int b0=CreateWindow(0, "BUTTON", "Check0", 9+1342177280, 20, 10, 70, 20, formatwi(w), 0, 0, 0);
int b1=CreateWindow(0, "BUTTON", "Check1", 9+1342177280, 20, 30, 70, 20, formatwi(w), 0, 0, 0);
int b2=CreateWindow(0, "BUTTON", "Check2", 9+1342177280, 20, 50, 70, 20, formatwi(w), 0, 0, 0);
textbkcolor(255, 65280);
loop()sleep(1);
function getmessage(0, WM_COMMAND)
{
if (message.lparam==b0)textout(0, 200, 150, "0", 1);
if (message.lparam==b1)textout(0, 200, 150, "1", 1);
if (message.lparam==b2)textout(0, 200, 150, "2", 1);
}
Пример как добавить несколько radiobox (Отобразить)CODE:external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
while(window ("Диалог")==0)sleep(10);
win w=window ("Диалог");
int b0=CreateWindow(0, "BUTTON", "", 1073741824+131072, 20, 10, 90, 100, formatwi(w), 0, 0, 0);
int b1=CreateWindow(0, "BUTTON", "Check1", 9+1342177280, 30, 30, 70, 20, formatwi(w), 0, 0, 0);
int b2=CreateWindow(0, "BUTTON", "Check2", 9+1342177280, 30, 50, 70, 20, formatwi(w), 0, 0, 0);
int b3=CreateWindow(0, "BUTTON", "Check3", 9+1342177280, 30, 70, 70, 20, formatwi(w), 0, 0, 0);
int b4=CreateWindow(0, "BUTTON", "", 1073741824+131072, 120, 10, 90, 100, formatwi(w), 0, 0, 0);
int b5=CreateWindow(0, "BUTTON", "Check4", 9+1342177280, 130, 30, 70, 20, formatwi(w), 0, 0, 0);
int b6=CreateWindow(0, "BUTTON", "Check5", 9+1342177280, 130, 50, 70, 20, formatwi(w), 0, 0, 0);
int b7=CreateWindow(0, "BUTTON", "Check6", 9+1342177280, 130, 70, 70, 20, formatwi(w), 0, 0, 0);
textbkcolor(255, 65280);
loop()sleep(1);
function getmessage(0, WM_COMMAND)
{
if (message.lparam==b1)textout(0, 150, 250, "1", 1);
if (message.lparam==b2)textout(0, 150, 250, "2", 1);
if (message.lparam==b3)textout(0, 150, 250, "3", 1);
if (message.lparam==b5)textout(1, 250, 250, "4", 1);
if (message.lparam==b6)textout(1, 250, 250, "5", 1);
if (message.lparam==b7)textout(1, 250, 250, "6", 1);
} |
|
|
Kibor |
Отправлено: 01 Февраля, 2019 - 23:31:15
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Добавил функции
loword и hiword, что бы не надо было их вычислять таким образом:
CODE:int cis=4294967290;
int a=address(#cis);
char c[4];
int b=address(#c[0]);
char c1[4];
int b1=address(#c1[0]);
c[0]=addressc(a);
c[1]=addressc(a+1);
c[2]=0;
c[3]=0;
c1[0]=addressc(a+2);
c1[1]=addressc(a+3);
c1[2]=0;
c1[3]=0;
int p=addressi(b);
int x=addressi(b1);
messagebox (p);
messagebox (x);
С помощью этих функций это делается так:
CODE:int cis=4294967290;
int p=loword(cis);
int x=hiword(cis);
messagebox (p);
messagebox (x);
Пример создания и обработка ползунка и замена текста в static
CODE:external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SetScrollRange", "SetScrollRange", "User32.dll" );
external(INT, "SetScrollPos", "SetScrollPos", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );
int b1, b2, s1, hText, hwnd;
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
win w=formatiw (hwnd);
int min=0, max=100, pos=95;
SetScrollRange(s1,2,min,max,1);
SetScrollPos(s1,2,pos,1);
Изменить_текст_и_прозрачность();
loop()sleep(1);
function Изменить_текст_и_прозрачность()
{
SetWindowText(hText, format(pos));
transparency(pos, w);
}
function getmessage(0, WM_COMMAND)
{
if (message.lparam==b1)messagebox ("Первая кнопка");
if (message.lparam==b2)messagebox ("Ворая кнопка");
}
function getmessage(0, WM_HSCROLL)
{
if (message.lparam==s1)
{
if (message.wparam==1 || message.wparam==3)//SB_LINERIGHT
{
pos=pos+10;
if (pos>max)pos=max;
SetScrollPos(s1,2,pos,1);
Изменить_текст_и_прозрачность();
return;
}
if (message.wparam==0 || message.wparam==2)//SB_LINELEFT
{
pos=pos-10;
if (pos<min)pos=min;
SetScrollPos(s1,2,pos,1);
Изменить_текст_и_прозрачность();
return;
}
///////////
if (loword(message.wparam)==5)//Зажали и двигаем
{
pos=pos-(pos-hiword(message.wparam));
if (pos>max)pos=max;
if (pos<min)pos=min;
SetScrollPos(s1,2,pos,1);
Изменить_текст_и_прозрачность();
}
}
}
//
function getmessage(0, WM_CREATE)//Создание кнопок
{
hwnd = gethwnd(0);
b1=CreateWindow(0, "BUTTON", "Первая кнопка", 1342177280, 10, 10, 120, 30, hwnd, 0, 0, 0);
b2=CreateWindow(0, "BUTTON", "Ворая кнопка", 1342177280, 10, 50, 120, 30, hwnd, 0, 0, 0);
s1=CreateWindow(0, "scrollbar", 0, 1342177280, 10, 100, 200, 20, hwnd, 0, 0, 0);
hText = CreateWindow(0, "STATIC", "",1342177280, 10, 150, 100, 15, hwnd, 0, 0, 0);
}
|
|
|
Dantes3000 |
Отправлено: 02 Февраля, 2019 - 00:51:16
|
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
|
Сделать кнопку неактивной и изменить ее текст (Отобразить)
CODE:external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "EnableWindow", "EnableWindow", "User32.dll" );
external(INT, "SetWindowTextA", "SetWindowTextA", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
while(window ("Диалог")==0)sleep(10);
win w=window ("Диалог");
int b1=CreateWindow(0, "BUTTON", "Неактивна", 1342177280, 10, 10, 120, 30, formatwi(w), 0, 0, 0);
int b2=CreateWindow(0, "BUTTON", "Активна", 1342177280, 10, 50, 120, 30, formatwi(w), 0, 0, 0);
EnableWindow(b1, 0);
loop()sleep(1);
function getmessage(0, WM_COMMAND)
{
if (message.lparam==b1)
{
EnableWindow(b1, 0); SetWindowTextA(b1, "Неактивна");
EnableWindow(b2, 1); SetWindowTextA(b2, "Активна");
}
if (message.lparam==b2)
{
EnableWindow(b1, 1); SetWindowTextA(b1, "Активна");
EnableWindow(b2, 0); SetWindowTextA(b2, "Неактивна");
}
}
|
|
|
Kibor |
Отправлено: 02 Февраля, 2019 - 01:35:33
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Budni пишет: А можно как то сделать чтобы координаты отображались под курсором без диалогового окна?
CODE:int x, y;
loop()
{
getmouse(x, y);
textout(0, x+20, y, format(x)+" "+format(y), 1);
sleep(10);
}
Вариант улучшенный
CODE:int x, y, x1, y1;
loop()
{
getmouse(x, y);
if (x!=x1 || y!=y1)
{
textout(0, x+20, y, format(x)+" "+format(y), 1);
x1=x; y1=y;
}
sleep(10);
} |
|
|
|