2009-02-03 9 views
2

J'essaie de trouver comment rendre les widgets SWT (par exemple Label, Frame) ayant une forme autre que rectangulaire.Formes de widget personnalisées dans SWT

J'ai créé une fenêtre principale en forme personnalisée à l'aide de la méthode setRegion(). Maintenant, j'aimerais que les widgets dans la fenêtre suivent la même forme. J'ai essayé d'utiliser la méthode setRegion() sur les widgets eux-mêmes (ils en héritent) mais rien ne se passe.

Comment créer un widget SWT avec une forme personnalisée?

Répondre

6

J'ai réussi à résoudre ce problème. Il semble que ma difficulté provenait d'un malentendu sur la façon de définir une région personnalisée. La méthode setBounds() définit le système de coordonnées pour la région personnalisée. Je supposais que la région et setBounds utilisaient le même système de coordonnées et le résultat n'affichait pas du tout le widget.

L'image affiche l'effet. L'étiquette verte sur la gauche se courbe comme la fenêtre principale, tandis que l'image grise dans le coin inférieur droit ne le fait pas.

L'image apparaît dans l'aperçu, mais pas la réponse affichée, essayez: http://img87.imageshack.us/my.php?image=curvecroppedwf8.png

Les fragments de code pour ce faire:

Display display = Display.getDefault(); 
Shell shell new Shell(display, SWT.NO_TRIM | SWT.ON_TOP); 

// make the region for the main window 
// circle is a method that returns a list of points defining a circle 
Region region = new Region(); 
region.add(350, 0, 981, 51); 
region.add(circle(380,51,30)); 
region.add(circle(951,51,30)); 
region.add(380, 51, 571, 30); 
shell.setRegion(region); 
Rectangle rsize = region.getBounds(); 
shell.setSize(rsize.width, rsize.height); 

Composite main = new Composite(shell, SWT.NULL); 

// make the label 
cpyLbl = new Label(main, SWT.NONE); 
cpyLbl.setText("Copy"); 

cpyLbl.setBackground(SWTResourceManager.getColor(38,255,23)); 

Region cpyRegion = new Region(); 
cpyRegion.add(0, 0, 161, 51); 
cpyRegion.add(circle(28,51,28)); 
cpyRegion.add(28, 51, 133, 28); 
cpyLbl.setRegion(cpyRegion); 

// the top left of the bounds is the 0,0 of the region coordinates 
// bounds are in screen coordinates (maybe shell coordinates?) 
cpyLbl.setBounds(352, 0, 161, 79); 
cpyLbl.setVisible(true);