Сразу код, ниже описание и вопросы.
// Удаление контролов для акции инвентаря
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 ведут себя как и должны...











