您的位置:首页 > 运维架构 > Shell

swt创建不规则窗口

2008-08-24 23:24 323 查看
import org.eclipse.swt[/b].SWT[/b];
import org.eclipse.swt[/b].events.MouseEvent;
import org.eclipse.swt[/b].events.MouseListener;
import org.eclipse.swt[/b].events.MouseMoveListener;
import org.eclipse.swt[/b].graphics.Point;
import org.eclipse.swt[/b].graphics.Rectangle;
import org.eclipse.swt[/b].graphics.Region;
import org.eclipse.swt[/b].widgets.Display;
import org.eclipse.swt[/b].widgets.Shell;

public class RingShell {
int[] createCircle(int radius, int centerX, int centerY) {
  int[] points = new int[360 * 2];
  for (int i = 0; i < 360; i++) {
   points[i * 2] = centerX
     + (int) (radius * Math.cos(Math.toRadians(i)));
   points[i * 2 + 1] = centerY
     + (int) (radius * Math.sin(Math.toRadians(i)));
  }
  return points;
}

Point originalPosition = null;

public RingShell() {
  final Display display = new Display();
  final Shell shell = new Shell(display, SWT[/b].NO_TRIM | SWT[/b].ON_TOP);
  shell.setBackground(display.getSystemColor(SWT[/b].COLOR_DARK_MAGENTA));
  Region region = new Region();
  region.add(createCircle(100, 100, 100));
  region.subtract(createCircle(50, 100, 100));
  shell.setRegion(region);
  // Make the shell movable by using the mouse pointer.
  shell.addMouseListener(new MouseListener() {
   public void mouseDoubleClick(MouseEvent e) {
    shell.dispose(); // Double click to dispose the shell.
   }

   public void mouseDown(MouseEvent e) {
    originalPosition = new Point(e.x, e.y);
   }

   public void mouseUp(MouseEvent e) {
    originalPosition = null;
   }
  });
  shell.addMouseMoveListener(new MouseMoveListener() {
   public void mouseMove(MouseEvent e) {
    if (originalPosition == null)
     return;
    Point point = display.map(shell, null, e.x, e.y);
    shell.setLocation(point.x - originalPosition.x, point.y
      - originalPosition.y);
    System.out.println("Moved from: " + originalPosition + " to "
      + point);
   }
  });
  Rectangle regionBounds = region.getBounds();
  shell.setSize(regionBounds.width, regionBounds.height);
  shell.open();

  // Set up the event loop.
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    // If no more entries in event queue
    display.sleep();
   }
  }
  display.dispose();
  region.dispose();
}

public static void main(String[] args) {
  new RingShell();
}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息