Kibor |
Отправлено: 15 Мая, 2019 - 23:55:31
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Обновил программу.
Теперь переменные
Цитата: message.x - координата мыши X
message.y - координата мыши Y
message.wparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message
message.lparam - определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message
локальные для каждой функции событий.
Раньше такой код
CODE:external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
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 getmessage(0, WM_CREATE)//Создаем контролы при создание окна
{
int 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);
}
function getmessage(0, WM_COMMAND)
{
if (message.lparam==b1)messagebox ("Первая кнопка");
if (message.lparam==b2)messagebox ("Ворая кнопка");
}
function getmessage(0, WM_LBUTTONDOWN)//Отлавливаем клик правой кнопки мыши всплывающее меню
{
messagebox("1 "+format(message.x));
looptime(2000){}
messagebox("2 "+format(message.x));
}
function getmessage(0, 15)//WM_PAINT Отлавливаем обновление окна
{
textout(1, w.left, w.top, " Обновили окно ", 0);
sleep(100);
}
мог вести себя не корректно, в том случае если пришло событие, к примеру клик мыши и в этой функции необходимо заюзать переменные message.x и message.у. То в случае если код в этой функции долго выполнялся и эти переменные использовались в конце кода, то вызов другого события посреди выполнения функции события мыши перезаписывал эти переменные и в конце функции они имели значения с другого getmessage.
К примеру
CODE:function getmessage(0, WM_LBUTTONDOWN)//Отлавливаем клик правой кнопки мыши всплывающее меню
{
messagebox("1 "+format(message.x));
looptime(2000){}//В это время кликаем по кнопке и выполнится WM_COMMAND и переменные перзапишутся.
messagebox("2 "+format(message.x));//Тут уже было бы не то значение что в первом сообщение
}
function getmessage(0, WM_COMMAND)
{//Тут перезапишутся переменные
if (message.lparam==b1)messagebox ("Первая кнопка");
if (message.lparam==b2)messagebox ("Ворая кнопка");
}
Устранил. Все переменные на каждое событие изолированы. Локальные. Другим событием не перезапишутся. |
|
|
Kibor |
Отправлено: 16 Мая, 2019 - 02:59:26
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Zireael пишет: Ещё бы добавить возможность включать/отключать обработку события.
По галке можно делать return после захода.
После return он вернется на строку на которой его прервал.
В логе выглядит так. Потому что последнюю команду он не выполнил, так как в лог пишет до выполнения, а ее выполнение было был прервано. И он повторно на нее вернется.
Такой код
CODE:
loop()
{
sleep(1);
sleep(2);
sleep(3);
sleep(4);
sleep(5);
}
function getmessage(0, WM_LBUTTONDOWN)
{
if(flag_check[0]==0)return;
beep(2500, 100);
}
CODE:sleep ( 5 )
sleep ( 1 )
sleep ( 2 )
sleep ( 3 )
if ( flag_check [ 0 ] == 0 )
return
sleep ( 3 )
sleep ( 4 )
sleep ( 5 )
sleep ( 1 )
sleep ( 2 )
sleep ( 3 )
sleep ( 4 )
sleep ( 5 )
sleep ( 1 )
sleep ( 2 )
sleep ( 3 )
sleep ( 4 )
sleep ( 5 )
sleep ( 1 )
sleep ( 2 )
sleep ( 3 )
sleep ( 4 )
sleep ( 5 )
sleep ( 1 )
sleep ( 2 )
sleep ( 3 )
sleep ( 4 )
sleep ( 5 )
sleep ( 1 )
sleep ( 2 )
sleep ( 3 )
sleep ( 4 )
sleep ( 5 )
sleep ( 1 )
sleep ( 2 )
if ( flag_check [ 0 ] == 0 )
return
sleep ( 2 )
sleep ( 3 )
sleep ( 4 )
sleep ( 5 )
sleep ( 1 )
sleep ( 2 )
А такой код
CODE:
if (fopen ("c:\5.txt", "w")!=0)
{
loop()
{
fwrite(1);fwrite(ENDL);//з
fwrite(2);fwrite(ENDL);//з
fwrite(3);fwrite(ENDL);//з
fwrite(4);fwrite(ENDL);//з
fwrite(5);fwrite(ENDL);//з
}
fclose();//закрываем файл
}
function getmessage(0, WM_LBUTTONDOWN)//Отлавливаем клик левой кнопки мыши
{
if(flag_check[0]==0)
{
fwrite("return!!!!!!!!!!!!!!!!!!!");fwrite(ENDL);//з
return;
}
fwrite("beep");fwrite(ENDL);//з
beep(2500, 100);
}
Покажет такую запись в файле. То есть реально отработанные строки
CODE:1
2
3
4
5
1
2
3
4
5
1
2
return!!!!!!!!!!!!!!!!!!!
3
4
5
1
2
3
4
5
1
2
3 |
|
|
Zireael |
Отправлено: 04 Июня, 2019 - 10:40:38
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Пример как создать скролл (Отобразить)CODE:#define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
#define SB_LINELEFT 0
#define SB_LINERIGHT 1
#define SB_THUMBTRACK 5
#define SB_CTL 2
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SetScrollRange", "SetScrollRange", "User32.dll" );
external(INT, "SetScrollPos", "SetScrollPos", "User32.dll" );
int scroll;
int min=0, max=1000, pos=200; // минимум, максимум, начальная позиция
int step=20; // шаг
createdialog(0);
showdialog(0, "Диалог",200, 200, 300, 300, 1, 1);
SetScrollRange(scroll, SB_CTL, min, max,1);
SetScrollPos(scroll, SB_CTL, pos,1);
textbkcolor(255, 65280);
loop()
{
textout(1, 300, 300, format(pos), 1);
sleep(1);
}
function getmessage(0, WM_CREATE)
{
scroll=CreateWindow(0, "scrollbar", 0, WS_CHILD | WS_VISIBLE, 10, 10, 200, 20, gethwnd(0), 0, 0, 0);
}
function getmessage(0, WM_HSCROLL)
{
if (message.lparam==scroll)
{
if (message.wparam==SB_LINERIGHT)
{
pos=pos+step;
if (pos>max)pos=max;
SetScrollPos(scroll, SB_CTL, pos, 1);
return;
}
if (message.wparam==SB_LINELEFT)
{
pos=pos-step;
if (pos<min)pos=min;
SetScrollPos(scroll, SB_CTL, pos, 1);
return;
}
if (loword(message.wparam)==SB_THUMBTRACK)
{
pos=pos-(pos-hiword(message.wparam));
if (pos>max)pos=max;
if (pos<min)pos=min;
SetScrollPos(scroll, SB_CTL, pos, 1);
}
}
}
Пример2 как создать скролл (Отобразить)CODE:#define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
#define WS_BORDER 8388608
#define SBS_VERT 1
#define SB_LINEDOWN 1
#define SB_LINEUP 0
#define EM_SETMARGINS 211
#define ES_RIGHT 2
#define EC_RIGHTMARGIN 2
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "GetWindowText", "GetWindowTextA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );
int min=0, max=100, pos=90; // минимум, максимум, начальная позиция
int edit1, edit_scroll;
char text_edit[99];
createdialog(0);
showdialog(0, "Dialog",100, 100, 300, 300, 1, 1);
loop()sleep(10);
function getmessage(0, WM_CREATE)
{
edit1=CreateWindow(0, "EDIT", format(pos), ES_RIGHT | WS_CHILD | WS_VISIBLE | WS_BORDER, 25, 60, 40, 20, gethwnd(0), 0, 0, 0); // edit, текст прижат к правому краю
sendmessage(EM_SETMARGINS, EC_RIGHTMARGIN, 5 * 65536, formatiw(edit1)); // отступ от правого края 5 пикселей (можно убрать)
edit_scroll=CreateWindow(0, "scrollbar", 0, SBS_VERT | WS_CHILD | WS_VISIBLE, 67, 60, 20, 20, gethwnd(0), 0, 0, 0); // вертикальный скролл
}
function getmessage(0, WM_VSCROLL)
{
if(message.lparam==edit_scroll) // если нажат скролл
{
if(GetWindowText(edit1, address(#text_edit[0]), sizearray(text_edit))) // получить текст из edit
{
if(loword(message.wparam)==SB_LINEDOWN) // если вниз
{
if(formatsn(format(#text_edit[0]))>min) // если больше min
SetWindowText(edit1, format(formatsn(format(#text_edit[0]))-1)); // уменьшить 1
return;
}
if(loword(message.wparam)==SB_LINEUP) // если вверх
{
if(formatsn(format(#text_edit[0]))<max) // если меньше max
SetWindowText(edit1, format(formatsn(format(#text_edit[0]))+1)); // увеличить на 1
return;
}
}
}
}
Пример3 как создать скролл (Отобразить)CODE:#define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
#define WS_BORDER 8388608
#define SB_LINERIGHT 1
#define SB_LINELEFT 0
#define SB_THUMBTRACK 5
#define SB_PAGELEFT 2
#define SB_PAGERIGHT 3
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "GetWindowText", "GetWindowTextA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );
int min=0, max=100, pos=90; // минимум, максимум, начальная позиция
int edit1, edit_scroll;
char text_edit[99];
createdialog(0);
showdialog(0, "Dialog", 100, 100, 300, 300, 1, 1);
loop()sleep(10);
function getmessage(0, WM_CREATE)
{
edit1=CreateWindow(0, "EDIT", "95", WS_CHILD | WS_VISIBLE | WS_BORDER, 25, 60, 30, 20, gethwnd(0), 0, 0, 0); // edit
edit_scroll=CreateWindow(0, "scrollbar", 0, WS_CHILD | WS_VISIBLE, 57, 60, 20, 20, gethwnd(0), 0, 0, 0); // скролл
}
function getmessage(0, WM_HSCROLL)
{
if (message.lparam==edit_scroll)
{
if(GetWindowText(edit1, address(#text_edit[0]), sizearray(text_edit))) // получить текст из edit
{
if (message.wparam==SB_LINELEFT) // если влево
{
if(formatsn(format(#text_edit[0]))>min) // если больше min
SetWindowText(edit1, format(formatsn(format(#text_edit[0]))-1)); // уменьшить 1
return;
}
if (message.wparam==SB_LINERIGHT) // если вправо
{
if(formatsn(format(#text_edit[0]))<max) // если меньше max
SetWindowText(edit1, format(formatsn(format(#text_edit[0]))+1)); // увеличить на 1
return;
}
}
}
} |
|
|
Kibor |
Отправлено: 04 Июня, 2019 - 11:12:22
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Zireael пишет: Пример как создать скролл (Отобразить)
Не все обработано. Не работает клик по полосе.
Скролл (Отобразить)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 - 23:13:05
|
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
|
Zireael пишет: static2=CreateWindow(0, "STATIC", "", 16+1342177280, 20, 40, 100, 1, gethwnd(0), 0, 0, 0); // горизонтальная линия
как сделать текст такого же шрифта, как эта линия? |
|
|
Zireael |
Отправлено: 08 Июля, 2019 - 14:40:09
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Почему в edit кириллица отображается иероглифами?
А откуда взят текст и как он добавлен в edit?
Цитата: Понимаю, что кодировка не та, но как сменить?
Функции winapi WideCharToMultiByte и MultiByteToWideChar.(Отредактировано автором: 08 Июля, 2019 - 14:56:42) |
|
|
|