我正在使用 Morphic / Squeak 实现图形用户界面。一些项目具有拖放功能。拖动时,我希望能够用鼠标滚轮旋转这些项目。
第一个问题是使用鼠标滚轮结束拖动动作并导致下降(尝试)。我怎样才能抑制它 - 并同时触发 mouseWheelEvent ?
第二个问题:如何将鼠标滚轮事件分配给我的 Morph?如上所述,此事件仅在拖动此 Morph 时相关。(解决了)
我正在使用 Morphic / Squeak 实现图形用户界面。一些项目具有拖放功能。拖动时,我希望能够用鼠标滚轮旋转这些项目。
第一个问题是使用鼠标滚轮结束拖动动作并导致下降(尝试)。我怎样才能抑制它 - 并同时触发 mouseWheelEvent ?
第二个问题:如何将鼠标滚轮事件分配给我的 Morph?如上所述,此事件仅在拖动此 Morph 时相关。(解决了)
似乎在选择支持它的 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
消息。)
查看handleEvent
in的一些代码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
,因此你会得到一个下降。如果你想让它起作用,你必须在这里改变一些东西。
你最好的选择是找到一个可以做你想要的事情的变形,然后浏览它的方法来看看它是如何做到的。话虽如此,我还没有遇到任何支持特定滚轮功能的产品,当然原来的施乐鼠标也没有这样的功能。