Сразу код, ниже описание и вопросы.
// Удаление контролов для акции инвентаря Ultima_Inventory_Delete_Action = { disableSerialization; ctrlDelete ((findDisplay 602) displayCtrl 20001); ctrlDelete ((findDisplay 602) displayCtrl 20002); ((findDisplay 602) displayCtrl 633) ctrlShow true; }; // Событие при дабл-клике по элементу списка Ultima_Show_Inventory_Action = { private ["_idc","_index","_text","_ctrl_Inventory_Action_Cancel","_ctrl_Inventory_Action"]; disableSerialization; _idc = ctrlIDC (_this select 0); _index = _this select 1; _text = lbText [_idc, _index]; // Прячем контрол списка ((findDisplay 602) displayCtrl 633) ctrlShow false; // Создаем кнопку _ctrl_Inventory_Action_Cancel = findDisplay 602 ctrlCreate ["RscButton", 20001]; // Размер - вся область экрана _ctrl_Inventory_Action_Cancel ctrlSetPosition [safezoneX,safezoneY,safezoneW,safezoneH]; // Прозрачная _ctrl_Inventory_Action_Cancel ctrlSetActiveColor [0, 0, 0, 0]; _ctrl_Inventory_Action_Cancel ctrlSetBackgroundColor [0, 0, 0, 0]; _ctrl_Inventory_Action_Cancel ctrlSetTextColor [0, 0, 0, 0]; _ctrl_Inventory_Action_Cancel ctrlSetFade 0; // Создаем кнопку _ctrl_Inventory_Action = findDisplay 602 ctrlCreate ["RscButton", 20002]; // Устанавливаем позицию левого верхнего угла - по координатам клика _ctrl_Inventory_Action ctrlSetPosition Ultima_Ctrl_Coord; // Текст кнопки _ctrl_Inventory_Action ctrlSetText "TEST"; // Вешаем события на кнопки, если произошел клик. ((findDisplay 602) displayCtrl 20001) ctrlSetEventHandler ["MouseButtonClick", "_this spawn Ultima_Inventory_Delete_Action"]; ((findDisplay 602) displayCtrl 20002) ctrlSetEventHandler ["MouseButtonClick", "_this spawn Ultima_Inventory_Delete_Action"]; // Отображаем обе кнопки _ctrl_Inventory_Action_Cancel ctrlCommit 0; _ctrl_Inventory_Action ctrlCommit 0; }; // Функция развешивает события на контролы Ultima_Inventory_Add_Actions = { disableSerialization; waitUntil { !(isNull (findDisplay 602)) }; // События для ListBox'a униформы // Получаем координаты курсора над списком ((findDisplay 602) displayCtrl 633) ctrlSetEventHandler ["MouseMoving","Ultima_Ctrl_Coord = [_this select 1, _this select 2, 0.07, 0.04];"]; // Обрабатываем событие - дабл клик по элементу списка ((findDisplay 602) displayCtrl 633) ctrlSetEventHandler ["LBDblClick", "_this spawn Ultima_Show_Inventory_Action"]; }; // Вешаем событие на открытие инвентаря. [] spawn { while {true} do { waitUntil { !(isNull (findDisplay 602)) }; [] spawn Ultima_Inventory_Add_Actions; waitUntil { (isNull (findDisplay 602)) }; }; };
Собсно, накидал небольшой тестовый скриптик для обработки левого клика по предмету инвентаря.
При клике добавляем дисплею 2 контрола - 2 кнопки
Первая - полностью прозрачная, без текста, во всю область экрана - кнопка отмены действия.
Вторая - кнопка действия, должна появляться в области клика(cursorPos).
Два вопроса:
1. Как сделать добавленный контрол прозрачным полностью?
_ctrl_Inventory_Action_Cancel ctrlSetActiveColor [0, 0, 0, 0]; _ctrl_Inventory_Action_Cancel ctrlSetBackgroundColor [0, 0, 0, 0]; _ctrl_Inventory_Action_Cancel ctrlSetTextColor [0, 0, 0, 0]; _ctrl_Inventory_Action_Cancel ctrlSetFade 0;
После добавления контрола,( кнопка отмена )
Экран слегка тускнеет - словно прозрачность не в 0 стоит, а в ~0.1
При наведении - полностью черная.
Мб еще какое то свойство есть?
Или заменить кнопку на картинку, и с прозрачного png перегнать в paa?
2. Почему контрол ЛистБокса перекрывает созданные контролы?
т.е. приходится скрывать ListBox:
// Прячем контрол списка ((findDisplay 602) displayCtrl 633) ctrlShow false;
А после обработки клика, вновь показывать:
((findDisplay 602) displayCtrl 633) ctrlShow true;
Иначе он перехватывает клик по кнопкам, словно находится слоем выше - как будто создан позже... Хотя все остальные элементы vcl ведут себя как и должны...