user-interface - 如何在 Squeak/Morphic GUI 中使用鼠标滚轮

标签 user-interface smalltalk mousewheel squeak morphic

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

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

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

最佳答案

似乎在选择支持它的 VM 实现上,Squeak 将鼠标滚轮映射到 Ctrl Up-ArrowCtrl-Down-Arrow 键事件。例如,在 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 消息。)

查看 HandMorphhandleEvent 的一些代码:

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].
        ].

Polymorph MouseWheelEvent 是 MouseEvent 的子类,它不会向 isMove 返回 true,因此您会掉线。如果你想让它工作,你必须在这里改变一些东西。

关于user-interface - 如何在 Squeak/Morphic GUI 中使用鼠标滚轮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2081985/

相关文章:

java - 如何在 SWT 中使用鼠标滚轮滚动滚动的复合 Material

java - Java 容器内的容器

c# - 与 Visual Studio 界面中的断点位于同一列的浅蓝色矩形的用途是什么?

windows - Smalltalk 相当于 Windows 的检查工具

smalltalk - 如何在 smalltalk 中显示消息框? (吱)

jQuery 工具可使用鼠标滚轮滚动 - 滚动一个位置并停止

java - 如何使 float 按钮可点击

java - 如何设置 JRadioButtons 的属性并将其应用于所有属性?

ide - 在 Smalltalk IDE(Squeak、VisualWorks 等)上,如何从正在处理的消息代码中导航到检查另一个消息?

apache-flex - Chrome 和 Firefox 中的鼠标滚轮