Comment faire qu’un Shell soit toujours au top dans SWT?

Je voudrais implémenter l’option de configuration “Toujours visible” dans mon application qui prend effet immédiatement.

Je sais que je peux appeler le constructeur Shell avec le style ON_TOP . Existe-t-il un moyen de le faire lors de l’exécution, c’est-à-dire après la création d’une instance Shell ?

Dans Cocoa, vous devez utiliser la reflection pour accéder à la window variable d’instance Shell, puis appeler window.setLevel(OS.NSStatusWindowLevel) .

Dans Carbon, vous devez accéder à la variable d’instance shellHandle , puis appeler OS.SetWindowGroup(shellHandle, OS.kFloatingWindowClass) . Vous pourrez peut-être vous en sortir en faisant tout ce dont vous avez besoin.

Dans les deux cas, vous devez également append de force le bit SWT.ON_TOP au champ de style . Surtout dans Carbon, beaucoup de choses dépendent de ce bit.

Sur Windows, vous pouvez le faire comme ceci:

 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); } 

Tous ces api sont publics, il n’y a donc pas lieu de réfléchir.

Le dernier argument de SetWindowPos n’est pas le même avec Shell.getStyle() . Le laisser comme 0 ne pose actuellement aucun problème pour moi.

Une fois, j’ai eu un problème similaire et j’ai trouvé un tel sujet:

http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg11143.html

Malheureusement je ne me souviens pas si ça marche …

Il n’existe aucun moyen standard de modifier les styles des widgets après leur création.

Vous devez vérifier quel code est exécuté au moment de la création, puis appeler la méthode native spécifique (dans le OS la classe).

Téléchargez la source de SWT pour votre plate-forme pour voir comment cela fonctionne. Ce n’est pas magique, juste un peu de débogage manuel.