3

Morphic / Squeak でグラフィカル ユーザー インターフェイスを実装しています。一部の項目にはドラッグ アンド ドロップ機能があります。ドラッグ中に、これらのアイテムをマウスホイールで回転できるようにしたいです。

最初の問題は、マウスホイールを使用するとドラッグ操作が終了し、ドロップ (試行) につながることです。どうすればそれを抑制できますか?同時に mouseWheelEvent を起動できますか?

2 番目の問題: どうすればモーフにマウスホイール イベントを割り当てることができますか? 前述のように、このイベントは、このモルフをドラッグしている間のみ関連します。(解決済み)

4

2 に答える 2

2

それをサポートすることを選択した VM 実装では、Squeak はマウス ホイールをCtrl Up-ArrowおよびCtrl-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メッセージを生成するだけです。)

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は、 true を返さない MouseEvent のサブクラスであるisMoveため、ドロップします。これを機能させたい場合は、ここで何かを変更する必要があります。

于 2010-01-17T22:56:50.373 に答える
0

あなたの最善の策は、あなたが望むようなことをするモーフを見つけてから、そのメソッドを参照してそれがどのように機能するかを確認することです. そうは言っても、ホイール固有の機能をサポートするものに出会ったことはありません。もちろん、元の Xerox マウスにはそのような機能はありませんでした。

于 2010-01-17T18:05:36.383 に答える