3

我正在使用 Morphic / Squeak 实现图形用户界面。一些项目具有拖放功能。拖动时,我希望能够用鼠标滚轮旋转这些项目。

一个问题是使用鼠标滚轮结束拖动动作并导致下降(尝试)。我怎样才能抑制它 - 并同时触发 mouseWheelEvent ?

第二个问题:如何将鼠标滚轮事件分配给我的 Morph?如上所述,此事件仅在拖动此 Morph 时相关。(解决了)

4

2 回答 2

2

似乎在选择支持它的 VM 实现上,Squeak 将鼠标滚轮映射到Ctrl 上箭头Ctrl 下箭头键事件。例如,在sqWin32Window.c中的 Win32 上:

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消息。)

查看handleEventin的一些代码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].
        ].

PolymorphMouseWheelEvent是 MouseEvent 的一个子类,它不会返回 true isMove,因此你会得到一个下降。如果你想让它起作用,你必须在这里改变一些东西。

于 2010-01-17T22:56:50.373 回答
0

你最好的选择是找到一个可以做你想要的事情的变形,然后浏览它的方法来看看它是如何做到的。话虽如此,我还没有遇到任何支持特定滚轮功能的产品,当然原来的施乐鼠标也没有这样的功能。

于 2010-01-17T18:05:36.383 回答