我想在我的应用程序中实现立即生效的“始终在顶部”配置选项。
我知道我可以用样式调用Shell
构造函数。ON_TOP
有没有办法在运行时做到这一点,即在Shell
实例已经创建之后?
我想在我的应用程序中实现立即生效的“始终在顶部”配置选项。
我知道我可以用样式调用Shell
构造函数。ON_TOP
有没有办法在运行时做到这一点,即在Shell
实例已经创建之后?
在 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 都是公开的,因此不需要反思。
最后一个参数 forSetWindowPos
与 不同Shell.getStyle()
。将其保留为 0 目前对我来说没有问题。
有一次我遇到了类似的问题,我发现了这样的线程:
http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg11143.html
不幸的是,我不记得它是否有效......
没有标准的方法可以在创建小部件后更改它们的样式。
您必须检查在创建期间执行了哪些代码,然后调用特定的本地方法(在类中OS
)。
为您的平台下载 SWT 的源代码,看看它是如何工作的。这不是魔术,只是一点手动调试。