【发布时间】:2011-02-17 13:22:42
【问题描述】:
我想在我的应用程序中实现“始终在最前面”配置选项,该选项会立即生效。
我知道我可以用ON_TOP 风格调用Shell 构造函数。有没有办法在运行时做到这一点,即在 Shell 实例已经创建之后?
【问题讨论】:
标签: java windows macos swt always-on-top
我想在我的应用程序中实现“始终在最前面”配置选项,该选项会立即生效。
我知道我可以用ON_TOP 风格调用Shell 构造函数。有没有办法在运行时做到这一点,即在 Shell 实例已经创建之后?
【问题讨论】:
标签: java windows macos swt always-on-top
在 Cocoa 中,您需要使用反射来获取 Shell 实例变量 window,然后调用 window.setLevel(OS.NSStatusWindowLevel)。
在 Carbon 中,您需要获取 shellHandle 实例变量,然后调用 OS.SetWindowGroup(shellHandle, OS.kFloatingWindowClass)。根据您的需要,您也许可以做这么多。
在任何一种情况下,您还应该将SWT.ON_TOP 位强制添加到style 字段。特别是在 Carbon 中,很多事情都依赖于设置的那个位。
【讨论】:
在 Windows 上,您可以这样做:
private static final void toggleAlwaysOnTop(Shell shell, boolean isOnTop){
long handle = shell.handle;
Point location = shell.getLocation();
Point dimension = shell.getSize();
OS.SetWindowPos(handle, isOnTop ? OS.HWND_TOPMOST : OS.HWND_NOTOPMOST,location.x, location.y, dimension.x, dimension.y, 0);
}
所有这些 api 都是公开的,因此无需反思。
SetWindowPos 的最后一个参数与Shell.getStyle() 不同。将其保留为 0 目前对我没有任何问题。
【讨论】:
有一次我遇到了类似的问题,我发现了这样的帖子:
http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg11143.html
不幸的是,我不记得它是否有效......
【讨论】:
没有标准的方法可以在创建后更改小部件的样式。
您必须检查在创建期间执行了哪些代码,然后调用特定的本地方法(在类OS 中)。
为您的平台下载 SWT 的源代码,看看它是如何工作的。这不是魔法,只是一点点手动调试。
【讨论】: