Как использовать колесико мыши в Squeak / Morphic GUI - PullRequest
3 голосов
/ 17 января 2010

Я реализую графический интерфейс пользователя с Morphic / Squeak. Некоторые элементы имеют функцию перетаскивания. При перетаскивании я хочу иметь возможность вращать эти элементы с помощью колесика мыши.

Первая проблема заключается в том, что использование колесика мыши завершает действие перетаскивания и приводит к падению (попытке). Как я могу подавить это - и запустить mouseWheelEvent одновременно?

Вторая проблема : Как я могу назначить событие mousewheel для моего Morph? Как упоминалось выше, это событие имеет значение только при перетаскивании этого морфа. (решено)

Ответы [ 2 ]

2 голосов
/ 18 января 2010

Похоже, что в реализациях виртуальных машин, которые выбрали его поддержку, Squeak отображает колесо мыши на Ctrl Up-Arrow и Ctrl-Down-Arrow ключевые события. Например, на Win32 в sqWin32Window.c :

if( WM_MOUSEWHEEL == message || g_WM_MOUSEWHEEL == message ) {
    /* Record mouse wheel msgs as CTRL-Up/Down */
    short zDelta = (short) HIWORD(wParam);
    if(inputSemaphoreIndex) {
        sqKeyboardEvent *evt = (sqKeyboardEvent*) sqNextEventPut();
        evt->type = EventTypeKeyboard;
        evt->timeStamp = lastMessage->time;
        evt->charCode = (zDelta > 0) ? 30 : 31;
        evt->pressCode = EventKeyChar;
        evt->modifiers = CtrlKeyBit;
        evt->utf32Code = 0;
        evt->reserved1 = 0;
    } else {
        buttonState = 64;
        if (zDelta < 0) {
            recordVirtualKey(message,VK_DOWN,lParam);
        } else {
            recordVirtualKey(message,VK_UP,lParam);
        }
    }
    return 1;
}

Так что это в значительной степени то, с чем вы должны работать в Squeak. (Если вы используете расширения Polymorph, есть специальное событие mouseWheel, но все, что они делают, это фильтруют Ctrl-Up и Ctrl-Down и генерируют "фальшивое" MouseWheelEvent сообщение.)

Глядя на код для handleEvent в HandMorph:

evt isMouse ifTrue:[
    self sendListenEvent: evt to: self mouseListeners.
    lastMouseEvent _ evt].

    "Check for pending drag or double click operations."
    mouseClickState ifNotNil:[
        (mouseClickState handleEvent: evt from: self) ifFalse:[
        "Possibly dispatched #click: or something and will not re-establish otherwise"
        ^self mouseOverHandler processMouseOver: lastMouseEvent]].

        evt isMove ifTrue:[
            self position: evt position.
            self sendMouseEvent: evt.
        ] ifFalse:[
            "Issue a synthetic move event if we're not at the position of the event"
            (evt position = self position) ifFalse:[self moveToEvent: evt].
            "Drop submorphs on button events"
            (self hasSubmorphs) 
                ifTrue:[self dropMorphs: evt]
                ifFalse:[self sendMouseEvent: evt].
        ].

Полиморф MouseWheelEvent является подклассом MouseEvent, который не возвращает true в isMove, следовательно, вы получаете падение. Вам нужно что-то изменить здесь, если вы хотите, чтобы это работало.

0 голосов
/ 17 января 2010

Лучше всего найти морфа, который делает что-то вроде того, что вы хотите, а затем просмотреть его методы, чтобы увидеть, как он это делает. Сказав это, я не сталкивался ни с одним, поддерживающим функции, специфичные для колес, и, конечно, оригинальная мышь Xerox не имела такой функции.

...