演示代码:
int[] createCircle(int raio, int centroX, int centroY) {
int[] pontos = novo int[360 * 2];
for(int i=0; i<360; i++) {
pontos[i*2] = centroX + (int)(raio * Math.cos(Math.toRadians(i)));
pontos[i*2+1] = centroY + (int)(raio * Math.sin(Math.toRadians(i)));
}
pontos de retorno;
}
Ponto originalPosition = null;
public RingShell() {
display final display = new Display();
shell final Shell = novo Shell (exibição, SWT.NO_TRIM | SWT.ON_TOP);
shell.setBackground(display.getSystemColor(SWT.COLOR_DARK_MAGENTA));
Região região = nova Região();
região.add(criarCírculo(100, 100, 100));
região.subtract(createCircle(50, 100, 100));
shell.setRegion(região);
shell.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
display.dispose();
}
public void mouseDown(MouseEvent e) {
posição original = novo ponto (ex, ey);
}
public void mouseUp(MouseEvent e) {
posição original = null;
}
});
shell.addMouseMoveListener(new MouseMoveListener() {
public void mouseMove(MouseEvent e) {
if(posiçãooriginal == null) return;
Ponto ponto = display.map(shell, null, ex, ey);
shell.setLocation(ponto.x - posição original.x, ponto.y - posição original.y);
System.out.println("Movido de: " + originalPosition + " para " + ponto);
}
});
Retângulo regiãoBounds = região.getBounds();
shell.setSize(regionBounds.width,regionBounds.height);
shell.open();
enquanto (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
região.dispose();
}
public static void main(String[] args) {
novo RingShell();
}
}