Перейти к содержимому


Фотография

Вопрос по контролам дисплеев


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 25 January 2015 - 17:05

Сразу код, ниже описание и вопросы.

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

 


  • 0

#2 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 25 January 2015 - 17:16

 

Как сделать добавленный контрол прозрачным полностью?

Если по изучаете БИсовские скрипты обрабатывающие GUI, то обратите внимание на такой факт, невидимым контролс делается сменой его позиции, то есть, контролс убирается за экран, в лево, право, вверх, вниз, по вкусу. Когда контролс понадобится он перемещается на требуемую позицию, на экране.


 

Первая - полностью прозрачная, без текста, во всю область экрана - кнопка отмены действия.

Из каких соображений, во всю область экрана?

Батон сделан на базе класса, активный текст, и естественно он ведёт себя как и положено на действия курсора, меняет прозрачности и цвет.


Сообщение отредактировал SteelRat: 25 January 2015 - 17:17

  • 0

#3 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 25 January 2015 - 17:18

 

 

Как сделать добавленный контрол прозрачным полностью?

Если по изучаете БИсовские скрипты обрабатывающие GUI, то обратите внимание на такой факт, невидимым контролс делается сменой его позиции, то есть, контролс убирается за экран, в лево, право, вверх, вниз, по вкусу. Когда контролс понадобится он перемещается на требуемую позицию, на экране.


 

Первая - полностью прозрачная, без текста, во всю область экрана - кнопка отмены действия.

Из каких соображений, во всю область экрана?

Батон сделан на базе класса, активный текст, и естественно он ведёт себя как и положено да действия курсора, меняет прозрачности и цвет.

 

Он мне нужен на экране для обработки клика.

Аля кнопка Cancel - только невидимый

Игрок кликает на предмет, появляется пункт меню(подобие PopUp меню), для отмены и удаления данного пункта, достаточно кликнуть в любой области экрана. - Эту область занимает контрол со 100% транспарентом.


Сообщение отредактировал NoNameUltima: 25 January 2015 - 17:19

  • 0

#4 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 25 January 2015 - 17:28

 

2. Почему контрол ЛистБокса перекрывает созданные контролы?

т.е. приходится скрывать ListBox:

С большой долей вероятности, это по тому, что ваш код обрабатывающий GUI, на много лаконичней, чем БИСовский, от того, ваш код завершает свою работу на много быстрее того момента когда в БИСовском дело доходит до листбокса.

GUI дисплея инвентаря по сути строится из кода или процедурно, как будет угодно, в конфиге по сути просто созданы требуемые классы.


 

 

 

Как сделать добавленный контрол прозрачным полностью?

Если по изучаете БИсовские скрипты обрабатывающие GUI, то обратите внимание на такой факт, невидимым контролс делается сменой его позиции, то есть, контролс убирается за экран, в лево, право, вверх, вниз, по вкусу. Когда контролс понадобится он перемещается на требуемую позицию, на экране.


 

Первая - полностью прозрачная, без текста, во всю область экрана - кнопка отмены действия.

Из каких соображений, во всю область экрана?

Батон сделан на базе класса, активный текст, и естественно он ведёт себя как и положено да действия курсора, меняет прозрачности и цвет.

 

Он мне нужен на экране для обработки клика.

Аля кнопка Cancel - только невидимый

Игрок кликает на предмет, появляется пункт меню(подобие PopUp меню), для отмены и удаления данного пункта, достаточно кликнуть в любой области экрана. - Эту область занимает контрол со 100% транспарентом.

 

Не изящней будет обработать событие потери фокуса PupUpа курсором?


  • 0

#5 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 25 January 2015 - 17:33

 

 

2. Почему контрол ЛистБокса перекрывает созданные контролы?

т.е. приходится скрывать ListBox:

С большой долей вероятности, это по тому, что ваш код обрабатывающий GUI, на много лаконичней, чем БИСовский, от того, ваш код завершает свою работу на много быстрее того момента когда в БИСовском дело доходит до листбокса.

GUI дисплея инвентаря по сути строится из кода или процедурно, как будет угодно, в конфиге по сути просто созданы требуемые классы.

 

Это было бы так, если бы я отрисовывал "подложку", с кнопкой, ДО того как был создан лист бокс, но я ведь их создаю по клику на итем уже созданного списка...

Хотя... мб событие перерисовки бисовское такое, что постоянно перерисовывает итемы листбокса... типа refresh repaint

Ну предположим...

Фиг с ним...

Хотя для красоты, хотелось бы, чтоб визуально ничего не менялось на экране пользователя, а просто появлялась кнопочка)

 

По поводу прозачной "подложки" - кнопки - cancel

RscPicture, без явного указания картинки которая будет в ней - может обрабатывать событие MouseButtonClick?


Сообщение отредактировал NoNameUltima: 25 January 2015 - 17:34

  • 0

#6 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 25 January 2015 - 17:44

class G_Interaction: RscControlsGroup
		{
			idc = 6902;
			x = 0.502;
			y = 0.250 * safezoneH;
			w = 0.145 * safezoneW;
			h = 0; //0.250 * safezoneH;
			onMouseMoving = "_this call gear_ui_offMenu;";

 

 

 

2. Почему контрол ЛистБокса перекрывает созданные контролы?

т.е. приходится скрывать ListBox:

С большой долей вероятности, это по тому, что ваш код обрабатывающий GUI, на много лаконичней, чем БИСовский, от того, ваш код завершает свою работу на много быстрее того момента когда в БИСовском дело доходит до листбокса.

GUI дисплея инвентаря по сути строится из кода или процедурно, как будет угодно, в конфиге по сути просто созданы требуемые классы.

 

Это было бы так, если бы я отрисовывал "подложку", с кнопкой, ДО того как был создан лист бокс, но я ведь их создаю по клику на итем уже созданного списка...

Хотя... мб событие перерисовки бисовское такое, что постоянно перерисовывает итемы листбокса... типа refresh repaint

Ну предположим...

Фиг с ним...

Хотя для красоты, хотелось бы, чтоб визуально ничего не менялось на экране пользователя, а просто появлялась кнопочка)

 

По поводу прозачной "подложки" - кнопки - cancel

RscPicture, без явного указания картинки которая будет в ней - может обрабатывать событие MouseButtonClick?

 

Вот это работает без геморроя, но суть в том, что контролсы созданы в конфиге дисплея инвентаре и через аддон данный дисплей пере конфигурируется.

disableSerialization;
_control = 	_this select 0;
_button =	_this select 1;
_parent = ctrlParent _control;
if ((time - dayzClickTime) < 1) exitWith {};

if (_button == 0) then {
	dayzClickTime = time;
	_group = _parent displayCtrl 6902;
	
	_pos = 		ctrlPosition _group;
	_pos set [0,((_this select 2) - 0.3)];
	_pos set [1,((_this select 3) + 0.05)];
	
	_index = lbCurSel _control;
	_item = _control lbData _index;		
	_conf = configFile >> "cfgMagazines" >> _item;
	if (!isClass _conf) then {
		_conf = configFile >> "cfgWeapons" >> _item;
	};
	_name = getText(_conf >> "displayName");	
	_cfgActions = _conf >> "ItemActions";
	_numActions = (count _cfgActions);
	_height = 0;

	if (_numActions > 0) then {
		//Populate Menu
		for "_i" from 0 to (_numActions - 1) do 
		{
			_menu = 	_parent displayCtrl (1600 + _i);
			_menu ctrlShow true;
			_config = 	(_cfgActions select _i);
			_type = 	getText	(_config >> "text");
			_script = 	getText	(_config >> "script");
			_outputOriented = 	getNumber	(_config >> "outputOriented") == 1;
			_height = _height + (0.025 * safezoneH);
//			if (getText(_conf >> "typeBox") == "Magazine") then {
//				_compile =  format["_id = ['%2',%3] %1;",_script,_item,_index];
//			} else {
				_compile =  format["_id = '%2' %1;",_script,_item];
//			};
			uiNamespace setVariable ['uiControl', _control];
			if (_outputOriented) then {
				/*
				This flag means that the action is output oriented
				the output class will then be transferred to the script
				and the type used for the name
				*/			
				_array = 	getArray	(_config >> "output");
				_outputClass = _array select 0;
				_outputType = _array select 1;
				_name = getText (configFile >> _outputType >> _outputClass >> "displayName");
				_compile =  format["_id = ['%2',%3] %1;",_script,_item,_array];
			};
		
			_menu ctrlSetText format[_type,_name];
			_menu ctrlSetEventHandler ["ButtonClick",_compile];
		};
	
		_pos set [3,_height];
		//hint format["Obj: %1 \nHeight: %2\nPos: %3",_item,_height,_grpPos];		

		_group ctrlShow true;
		ctrlSetFocus _group;
		_group ctrlSetPosition _pos;
		_group ctrlCommit 0;
	};
};

PS

 

Если по изучаете БИсовские скрипты обрабатывающие GUI, то обратите внимание на такой факт, невидимым контролс делается сменой его позиции, то есть, контролс убирается за экран, в лево, право, вверх, вниз, по вкусу. Когда контролс понадобится он перемещается на требуемую позицию, на экране.

Либо размеры контролса делаются нулевыми.


  • 0

#7 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 25 January 2015 - 18:30

В общем после раздумий, подумались 2 вещи)))))

1. Добавить статичную кнопку в инвентарь - "использовать", и делать ее активной, или нет, в зависимости от выбранного предмета, - вопрос только куда ее впихать))

2. Вместо rscButton, использовать RscListBox - это типа чей листобкс сильней))))) Вот реально стало интересно, перекроет ли он своей перерисовкой листбокс отображаемый ниже) Ну и как следствие, если использовать RscListBox, вместо кнопки, можно получить реальный аналог ПопАп меню)


  • 0

#8 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 25 January 2015 - 18:55

В общем после раздумий, подумались 2 вещи)))))

1. Добавить статичную кнопку в инвентарь - "использовать", и делать ее активной, или нет, в зависимости от выбранного предмета, - вопрос только куда ее впихать))

2. Вместо rscButton, использовать RscListBox - это типа чей листобкс сильней))))) Вот реально стало интересно, перекроет ли он своей перерисовкой листбокс отображаемый ниже) Ну и как следствие, если использовать RscListBox, вместо кнопки, можно получить реальный аналог ПопАп меню)

У меня для вас более продуктивное предложение, заберите это

http://arma3.ru/foru...3-full/?p=39944

или это

http://arma3.ru/foru...atform/?p=39227

реализация в обоих вариантах одинакова.

 

И изучите как реализовано взаимодействие с предметами инвентаря, и либо скопируйте, либо уже на рельсах этого реализуйте своё.

 

ЗЫ

Активация меню, двойной клик левой кнопки мыши.


Сообщение отредактировал SteelRat: 25 January 2015 - 18:58

  • 0

#9 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 26 January 2015 - 09:50

Спс. Гляну.

Но решил просто вешать на дабл клик использование.

switch+case

Не используемый предмет - нет реакции.

Используемый - выполнение скрипта.

Предполагаемый выбор в switch+case - создавать диалог.


  • 0




Яндекс.Метрика