007wan |
Отправлено: 01 Апреля, 2019 - 17:13:20
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Я не могу понять что куда в этих переменных HMENU, HMENU2, HMENU3, result;
В своем коде уже присутствуют такие, но я хочу добавить меню вызывающееся при клике правой кнопки. Пожалуйста. Можете дать код, где уже есть:
1)Вкладка "Меню", а при наведении на нее вверху, показывается "Настройки".
2)При клике правой кнопки, показывает окно, где содержит 2 вкладки:
- Размер окна(+еще 2 параметра: Минимальный и Максимальный)
- Прозрачность(25,50,75,100)
Я уже находил эти примеры, но проблема в другом, я запутался и не могу совместить свой код, где есть вкладка настройки с переменными, где нужно вставить код "клик по правой кнопки мыши). Поэтому прошу вас сделать вместе код, где есть уже это и то вместе, что бы мне разобраться.
(Добавление)
Просто в моем коде еще и переменные переименованы и мне сложно соединить 2 куска |
|
|
Zireael |
Отправлено: 02 Апреля, 2019 - 03:05:10
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
code (Отобразить)CODE:#define MIM_STYLE 16
#define MF_POPUP 16
#define TPM_RETURNCMD 256
#define MF_STRING 0
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, MIM_STYLE, 0, 0, 0, 0, 0};
int HMENU, HMENU1, HMENU2, HMENU3, result_menu;
win dialog;
createdialog(0);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
loop()sleep(1);
function getmessage(0, WM_CREATE)
{
// Создание меню "Настройки"
HMENU=CreateMenu();
AppendMenu(HMENU, MF_POPUP, 999, "Настройки" );
SetMenuInfo(HMENU, address(#MENUINFO[0]));
SetMenu(gethwnd(0), HMENU);
///////////
// Создание меню правой кнопки мыши
HMENU1=CreatePopupMenu(); // создали меню
HMENU2=CreatePopupMenu(); // создали меню
HMENU3=CreatePopupMenu(); // создали меню
AppendMenu(HMENU2, MF_STRING, 111, "Минимальный" ); // добавить строку в меню
AppendMenu(HMENU2, MF_STRING, 222, "Максимальный" ); // добавить строку в меню
AppendMenu(HMENU3, MF_STRING, 333, "25" ); // добавить строку в меню
AppendMenu(HMENU3, MF_STRING, 444, "50" );
AppendMenu(HMENU3, MF_STRING, 555, "75" );
AppendMenu(HMENU3, MF_STRING, 666, "100" );
AppendMenu(HMENU1, MF_POPUP, HMENU2, "Размер окна" ); // добавить подменю в меню
AppendMenu(HMENU1, MF_POPUP, HMENU3, "Прозрачность" ); // добавить подменю в меню
///////
}
function getmessage(0, WM_COMMAND)
{
if(loword(message.wparam)==999){messagebox ("Выбран пункт Настройки"); return;}
}
function getmessage(0, WM_RBUTTONDOWN)//Отлавливаем клик правой кнопки мыши
{
dialog=window("Диалог");
result_menu=TrackPopupMenu(HMENU1, TPM_RETURNCMD, message.x+dialog.leftclient, message.y+dialog.topclient, 0, formatwi(dialog), 0); // вывести меню
if(result_menu==111){messagebox("Выбран пункт Размер окна, Минимальный" ); return;}
if(result_menu==222){messagebox("Выбран пункт Размер окна, Максимальный" ); return;}
if(result_menu==333){messagebox("Выбран пункт Прозрачность, 25" ); return;}
if(result_menu==444){messagebox("Выбран пункт Прозрачность, 50" ); return;}
if(result_menu==555){messagebox("Выбран пункт Прозрачность, 75" ); return;}
if(result_menu==666){messagebox("Выбран пункт Прозрачность, 100" ); return;}
} |
|
|
007wan |
Отправлено: 02 Апреля, 2019 - 15:12:33
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael , Спасибо, Просто ЛУЧШИЙ!
(Добавление)
Zireael , Не работает меню, которое вызывается при нажатии на правую кнопку мыши. Я сделал вот что:
CODE:function getmessage(0, WM_COMMAND) CODE:function getmessage(0, WM_RBUTTONDOWN) CODE:function getmessage(0, WM_CREATE)
сделал коментами через "/*" до "*/" в результате вставил вместо них, то, что выше и запустил. Работает только настройки.
(Добавление)
Переменные так же все скопировал.
(Добавление)
В результате все блоки мои сейчас выглядят так:
CODE:function getmessage(0, WM_RBUTTONDOWN)
{
MainWindow = window ("диалог");
result_menu=TrackPopupMenu(HMENU1, TPM_RETURNCMD, message.x+MainWindow.leftclient, message.y+MainWindow.topclient, 0, formatwi(MainWindow), 0);
if(result_menu == 111)
{
messagebox("Выбран пункт Размер окна, Минимальный" );
return;
}
if(result_menu == 222)
{
messagebox("Выбран пункт Размер окна, Максимальный" );
return;
}
if(result_menu == 333)
{
messagebox("Выбран пункт Прозрачность, 25" );
return;
}
if(result_menu == 444)
{
messagebox("Выбран пункт Прозрачность, 50" );
return;
}
if(result_menu == 555)
{
messagebox("Выбран пункт Прозрачность, 75" );
return;
}
if(result_menu == 666)
{
messagebox("Выбран пункт Прозрачность, 100" );
return;
}
}
(Добавление)
CODE:function getmessage(0, WM_CREATE)
{
HMENU = CreateMenu();
AppendMenu(HMENU, MF_POPUP, 999, "Настройки" );
SetMenuInfo(HMENU, address(#MENUINFO[0]));
SetMenu(gethwnd(0), HMENU);
HMENU1 = CreatePopupMenu();
HMENU2 = CreatePopupMenu();
HMENU3 = CreatePopupMenu();
AppendMenu(HMENU2, MF_STRING, 111, "Минимальный" );
AppendMenu(HMENU2, MF_STRING, 222, "Максимальный" );
AppendMenu(HMENU3, MF_STRING, 333, "25" );
AppendMenu(HMENU3, MF_STRING, 444, "50" );
AppendMenu(HMENU3, MF_STRING, 555, "75" );
AppendMenu(HMENU3, MF_STRING, 666, "100" );
AppendMenu(HMENU1, MF_POPUP, HMENU2, "Размер окна" );
AppendMenu(HMENU1, MF_POPUP, HMENU3, "Прозрачность" );
Object_Button1 = CreateWindow(0, "BUTTON", "", WS_VISIBLE | WS_CHILD, 10, 10, 120, 20, gethwnd(0), 0, 0, 0);
Object_Button2 = CreateWindow(0, "BUTTON", "", WS_VISIBLE | WS_CHILD, 140, 10, 250, 20, gethwnd(0), 0, 0, 0);
Object_Listbox1 = CreateWindow(0, "LISTBOX", "", LBS_OWNERDRAWVARIABLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL | LBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE, 400, 10, 200, 200, gethwnd(0), 0, 0, 0);
EnableWindow(Object_Button2, 0);
}
(Добавление)
CODE:function getmessage(0, WM_COMMAND)
{
if(loword(message.wparam) == 999)
{
MainWindow = window ("диалог");
showdialog(1, "Настройки", MainWindow.left+100, MainWindow.top+100, 600, 500, 0, 1);
sendmessage(EM_LIMITTEXT, 70, 0, formatiw(Object_Edit1));
SendMessage(Object_Checkbox1, BM_SETCHECK, formatsn(format(#Load_Checkbox1[0])), 0);
SendMessage(Object_Checkbox2, BM_SETCHECK, formatsn(format(#Load_Checkbox2[0])), 0);
SendMessage(Object_Checkbox3, BM_SETCHECK, formatsn(format(#Load_Checkbox3[0])), 0);
SendMessage(Object_Checkbox4, BM_SETCHECK, formatsn(format(#Load_Checkbox4[0])), 0);
SendMessage(Object_Checkbox5, BM_SETCHECK, formatsn(format(#Load_Checkbox5[0])), 0);
SendMessage(Object_Edit1, WM_SETTEXT, 0, format(#Load_Edit1[0]), 0);
enabletimer(1);
}} |
|
|
Zireael |
Отправлено: 03 Апреля, 2019 - 01:50:48
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Не работает меню, которое вызывается при нажатии на правую кнопку мыши.
В моём примере работает. Ищите где ошибка у вас.
Цитата: MainWindow = window ("диалог" );
Окно хоть найдено? Может 'диалог' с заглавной буквы. |
|
|
007wan |
Отправлено: 03 Апреля, 2019 - 15:06:21
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael пишет: MainWindow = window ("диалог" );
Окно хоть найдено? Может 'диалог' с заглавной буквы.
У меня окно вообще не "диалог" называется, а по другому и оно везде стоит.
Теперь хочу спросиь: визуальное окно или resettextout() могут сбрасывать меню которое вызывается через ПКМ
(Добавление)
Почему отличаются? int MENUINFO[7] = {28, 16, 134217728, 0, 0, 0, 0};(этот предыдущий) и int MENUINFO[7]={28, MIM_STYLE, 0, 0, 0, 0, 0};(этот тот, котоырй скинул) |
|
|
Zireael |
Отправлено: 04 Апреля, 2019 - 02:11:52
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: У меня окно вообще не "диалог" называется, а по другому и оно везде стоит.
Тогда чего удивляться что не показывается меню? Окно не найдено, структура не заполнена, обращение к MainWindow.leftclient ничего не даст.
Цитата: Почему отличаются? int MENUINFO[7]
Цитата: MNS_NOTIFYBYPOS
Menu owner receives a WM_MENUCOMMAND message instead of a WM_COMMAND message when the user makes a selection.
Владелец меню получает сообщение WM_MENUCOMMAND вместо сообщения WM_COMMAND, когда пользователь делает выбор.
Разные сообщения отправляются при выборе пункта меню.
Цитата: визуальное окно или resettextout() могут сбрасывать меню которое вызывается через ПКМ
Закомментируйте эти 2 строчки и проверьте. |
|
|
007wan |
Отправлено: 04 Апреля, 2019 - 18:18:15
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Ладно, я переделаю код. Задам фундамент кода будет то, что ты скидывал...
(Добавление)
Нашел проблему! оказалось, что при добавлении функцииCODE:function getmessage(0, WM_SETCURSOR) Не срабатывает меню, которое вызывается ПКМ.
Вопрос: возможно ли исправить? Или как-то повлиять на содержимое так, что бы оно работало и с меню? Код WM_SETCURSOR (Отобразить)CODE:
function getmessage(0, WM_SETCURSOR)
{
if(message.wparam == Object_Button2)
{
if(GetWindowRect(Object_Button2, address(#RectButton2[0])))
{
GetWindowText(Object_Button2, address(#Text_Button2[0]), sizearray(Text_Button2));
if(format(#Text_Button2[0]) == "Получить изображение из игры")
{
a = a+1;
textbkcolor(255, 65280);
textout(0, MouseX+20, MouseY+20, "Внимание! Данная функция сильно нагружает систему.", 1);
getmouse(MouseX, MouseY);
}
}
}
}
(Добавление)
ДА, кстати, когда обе функции активны они обе как раз и не работают, хотя я думал, что какая-то из них будет функционировать все таки
(Добавление)
007wan пишет: LBS_OWNERDRAWVARIABLE Убираю опцию и текст снова показывается. Раньше не замечал, пока не заметил, что при запуске вставляет пустые слова, но они невидимы и кликабельны, т.к при нажатии виден указатель + еще полоса прокрутки вниз опускается.(Отредактировано автором: 04 Апреля, 2019 - 18:18:46) |
|
|
|