Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   contextMenu и mouseEnabled (http://www.flasher.ru/forum/showthread.php?t=86206)

MerlinTwi 10.10.2006 13:20

contextMenu и mouseEnabled
 
Проблема:
Если у мувиклипа стоит mouseEnabled=false, то при правом клике мышки его contextMenu игнорируется, а берется root.contextMenu, а не следующего мувиклипа под мышкой, как было бы логично предположить.
Ситуация:
Есть основной мувиклип со своим курсором, по ROLL_OVER системный мышиный курсор прячется, мой показывается, а при ROLL_OUT наоборот. У моего мышиного курсора стоит mouseEnabled=false иначе сразу срабатывает ROLL_OUT. У основного мувиклипа есть своя меню по правому кнопке мыши. Соответственно при наличии своего курсора мыши это меню не отображается.
Решение:
Пока вижу только такое: в момент показа своего курсора мыши присвоить root.contextMenu меню от основного мувиклипа. Но это как-то криво. Подскажите другие варианты.

etc 10.10.2006 13:37

Что-то мне кажется, что проблема в том, что ты скрыл курсор мыши, а не в contextMenu…

MerlinTwi 10.10.2006 13:55

Не, курсор мыши тут ни при чем, проверял. Играет роль только то, что у мувика mouseEnabled=false

Nirth 10.10.2006 14:03

Ты деактивировал поведение мышки у мувика, поэтому берется контекстное меню у мувика, у которого мышка не деактивированна(root в твоем случае)

etc 10.10.2006 14:11

Попробуй курсор мыши юзать внутри твоего клипа.

MerlinTwi 10.10.2006 14:12

Поправка, берется контекстное меню родителя а не обязательно рута.

Nirth, это-то понятно, вопрос что делать, если хочется и свой курсор и контекстное меню.

MerlinTwi 10.10.2006 14:13

Цитата:

Сообщение от __etc
Попробуй курсор мыши юзать внутри твоего клипа.

Плохо, клип может быть с маской, и тогда курсор будет обрезаться на границе.

etc 10.10.2006 14:23

Делай общий мувик, в нём курсор и мувик со всем остальным. Маску на вложенный мувик накладывай. А контекстное меню к общему контейнеру вешай.

Nirth 10.10.2006 14:25

Объясни плиз подробнее, я не могу точно понять, как построить пример.

у тебя есть какой то мувик, в котором курсор заменяется на кастомный?

MerlinTwi 10.10.2006 14:39

Вложений: 1
__etc, угу, как вариант... но тоже не красиво.

Nirth, да, мувик с кастомным курсором и контекстное меню. Пример в аттаче.

Nirth 10.10.2006 14:42

а если юзать MOUSE_OVER\MOUSE_OUT?

Код:

package {
        import flash.display.Sprite;
        import flash.ui.ContextMenu;
        import flash.events.ContextMenuEvent;

        public class Context extends Sprite
        {
                public function Context()
                {
                        addChild(new Square());
                }
       
                private function onMenuSelect(event:ContextMenuEvent):void
                {
                }
        }
}
        import flash.display.Sprite;
        import flash.events.*;;
        import flash.ui.*;
       


class Square extends Sprite
{
        public function Square()
        {
                graphics.beginFill(0xFF6600);
                graphics.drawRect(0,0,100,100);
                graphics.endFill();
               
                addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
                addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
                addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
               
                var menu:ContextMenu = new ContextMenu();
                        menu.addEventListener(ContextMenuEvent.MENU_SELECT,onMenuSelect);
                        menu.customItems.push(new ContextMenuItem("Hello world"));               
                contextMenu = menu;
        }
        private var cursor:Cursor = new Cursor();
       
       
        private function onMouseOver(event:MouseEvent):void
        {
                addChild(cursor);
                Mouse.hide();               
        }
       
        private function onMouseOut(event:MouseEvent):void
        {
                removeChild(cursor);
                Mouse.show()
        }
       
        private function onMouseMove(event:MouseEvent):void
        {
                cursor.x = event.localX;
                cursor.y = event.localY;
        }
       
        private function onMenuSelect(event:ContextMenuEvent):void
        {
                trace(this);
        }
}

class Cursor extends Sprite
{
        public function Cursor()
        {
                graphics.beginFill(0xFF0000);
                graphics.drawRect(0,0,10,10);
                graphics.endFill();
               
                mouseEnabled = false;
        }
}


etc 10.10.2006 14:42

Код:

import flash.ui.ContextMenu;
import flash.events.MouseEvent;
import flash.display.Sprite;
var sp:Sprite = new Sprite();
var cursor:Sprite = new Sprite();
var cm:ContextMenu = new ContextMenu();
var cmItem:ContextMenuItem = new ContextMenuItem('cmItem');
/////////////////
cm.customItems.push(cmItem);
/////////////////
sp.graphics.beginFill(0xFF0000);
sp.graphics.drawRect(10,10,100,100);
sp.contextMenu = cm;
/////////////////
cursor.graphics.beginFill(0x0000FF);
cursor.graphics.drawRect(0,0,10,10);
cursor.visible = false;
mouseMove = function(e:MouseEvent):void {
        e.updateAfterEvent();
}
mouseOver = function(e:MouseEvent):void {
        Mouse.hide();
        e.updateAfterEvent();
        cursor.startDrag(true);
        cursor.visible = true;
}
mouseOut = function(e:MouseEvent):void {
        Mouse.show();
        e.updateAfterEvent();
        cursor.stopDrag();
        cursor.visible = false;
}
/////////////////
this.addChild(sp);
this.addChild(cursor);
sp.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
sp.addEventListener(MouseEvent.MOUSE_OVER,mouseOver);
sp.addEventListener(MouseEvent.MOUSE_OUT,mouseOut);

Вроде работает… (Ну там, доработать надо)

Nirth 10.10.2006 14:54

ОФФТОП
а зачем ты во флэше импорты пишешь, там же вроде по умолчанию все импортированно? или я путаю

MerlinTwi 10.10.2006 15:00

Nirth, в вашем примере курсор мыши добавляется внутрь мувика, а значит будет обрезаться, если у мувика будет маска.
__etc, частный вариант, для произвольного мувика не подойдет, но можно сделать контейнер только для мыши, и по mouseOver делать cursor.parent.contextMenu = e.target.contextMenu; Тогда все работает, только в событии MENU_SELECT будут неправильные target, что я переживу. Этот вариант мне подходит.
Всем спасибо :)

etc 10.10.2006 15:02

Цитата:

Сообщение от Nirth
ОФФТОП
а зачем ты во флэше импорты пишешь, там же вроде по умолчанию все импортированно? или я путаю

На всякий случай.

Nirth 10.10.2006 15:48

__etc
я уже думал, а вдруг апдейт сделали, где надо вставлять и может еще че добавили... ну ладно

2 Мерлин
Я когда писал думал, что я делаю что то не так, но не мог понять что, догадался когда увидел код etc.

В твоем случае я бы сделал некий класс ContextMenuManager, который бы следил за менюшками, и передавал бы ссылки куда надо, так как event.target все равно не даст ссылки на дисплейобжект инициатор, а на ссылку контекстного меню, то кода на много больше всеравно не будет, если я правильно понял.


Часовой пояс GMT +4, время: 10:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.