小弟 请教各位大侠下,
托盘实现像QQ或飞秋样,来信息了,鼠标移到托盘位置,显示消息显示板,和qq跟飞秋样,
我纠结几天了,swt的托盘无法监听到鼠标的hover之类的事件,监听不到,想了很多法子,至今没有思路解决,
只想到一个流氓点的方法,就是当鼠标移到托盘位置,因为托盘设置了提示文字(settTooltipText),所以鼠标移到托盘位置,提示文
字会自然出现,我就想到,当提示文字出现的时候,我就显示消息面板,(当然前提是在有消息的时候才这么做),我看了很久的源
码,还是没成功,不知道swt自己的类库怎么实现提示文字的出现,望知道的朋友帮个忙,如果有更好的方法,求知不得!!!
希望知道的大哥们帮小弟下啊,天天向上啊
------解决方案--------------------
TrayItem里没有实现监听mouseover事件。要么你自己hack TrayItem类,在里面添加相应代码,然后替换原来的class文件。
另外或许你可以用ToolTip替代简单的tooltiptext。在点击托盘图标时如果有消息,就显示tooltip(通过setVisible(true))
------解决方案--------------------
使用selection+ToolTip widget只是一种可选的方法,为了方便,不需要写一个容器。
重写TrayItem,主要就是重写TrayItem面下面这一段事件处理的代码。这段代码只处理了button以及ballon相关的事件。你可以加上其他类型事件的处理,比如OS.WM_MOUSEHOVER,OS.WM_MOUSEMOVE。这只是给你个思路,有兴趣的话可以尝试一下。
- Java code
int /*long*/ messageProc (int /*long*/ hwnd, int msg, int /*long*/ wParam, int /*long*/ lParam) { /* * Feature in Windows. When the user clicks on the tray * icon, another application may be the foreground window. * This means that the event loop is not running and can * cause problems. For example, if a menu is shown, when * the user clicks outside of the menu to cancel it, the * menu is not hidden until an event is processed. If * another application is the foreground window, then the * menu is not hidden. The fix is to force the tray icon * message window to the foreground when sending an event. */ switch ((int)/*64*/lParam) { case OS.WM_LBUTTONDOWN: if (hooks (SWT.Selection)) { OS.SetForegroundWindow (hwnd); sendSelectionEvent (SWT.Selection); } break; case OS.WM_LBUTTONDBLCLK: case OS.WM_RBUTTONDBLCLK: if (hooks (SWT.DefaultSelection)) { OS.SetForegroundWindow (hwnd); sendSelectionEvent (SWT.DefaultSelection); } break; case OS.WM_RBUTTONUP: { if (hooks (SWT.MenuDetect)) { OS.SetForegroundWindow (hwnd); sendEvent (SWT.MenuDetect); // widget could be disposed at this point if (isDisposed()) return 0; } break; } case OS.NIN_BALLOONSHOW: if (toolTip != null && !toolTip.visible) { toolTip.visible = true; if (toolTip.hooks (SWT.Show)) { OS.SetForegroundWindow (hwnd); toolTip.sendEvent (SWT.Show); // widget could be disposed at this point if (isDisposed()) return 0; } } break; case OS.NIN_BALLOONHIDE: case OS.NIN_BALLOONTIMEOUT: case OS.NIN_BALLOONUSERCLICK: if (toolTip != null) { if (toolTip.visible) { toolTip.visible = false; if (toolTip.hooks (SWT.Hide)) { OS.SetForegroundWindow (hwnd); toolTip.sendEvent (SWT.Hide); // widget could be disposed at this point if (isDisposed()) return 0; } } if (lParam == OS.NIN_BALLOONUSERCLICK) { if (toolTip.hooks (SWT.Selection)) { OS.SetForegroundWindow (hwnd); toolTip.sendSelectionEvent (SWT.Selection); // widget could be disposed at this point if (isDisposed()) return 0; } } } break; } display.wakeThread (); return 0;}
------解决方案--------------------
我想能显示tooltip,就说明托盘能检测到MouseHover类事件,只不过针对此类事件,它执行的仅仅是显示tooltip