2010-03-10 64 views
1

的bug已經提交併固定(超快速)(GC): https://bugs.eclipse.org/bugs/show_bug.cgi?id=305294的Windows 7似乎打破SWT Control.print在SWT

只是爲了前言本,在這裏我的目標是打印將兩張圖片放到畫布上,這樣我就可以在屏幕上滑動畫布(想想iPhone),滑動控件本身的CPU密集度太高,所以這是一個很好的選擇,直到我在Win7上測試它爲止。我願意幫助我解決原來的問題,不需要解決以下問題。

有誰知道如何獲得「Control.print(GC)」以使用Windows 7 Aero?我的代碼在Windows XP和Windows 7中工作得很好,但禁用了Aero,但命令如下:

control.print(GC)會導致非頂級控件從屏幕被有效擦除。

GC gc = new GC(image); 
try { 
    // As soon as this code is called, calling "layout" on the controls 
    // causes them to disappear. 
    control.print(gc); 
} finally { 
    gc.dispose(); 
} 

我已經堆疊的控制和想從當前和下一控制,使得我可以「滑動」他們關閉屏幕打印圖像。但是,在打印非頂部控件時,它不會再重新繪製。

以下是一些示例代碼。 (有趣的代碼位在頂部,它將需要指向SWT才能工作。)

感謝您的任何和所有幫助。作爲解決辦法,我正在考慮在印刷品之間交換控件以查看是否有幫助,但我寧願不要。

import org.eclipse.swt.SWT; 
import org.eclipse.swt.custom.StackLayout; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.graphics.GC; 
import org.eclipse.swt.graphics.Image; 
import org.eclipse.swt.graphics.Point; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Control; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.swt.widgets.Shell; 

public class SWTImagePrintTest { 
    private Composite stack; 
    private StackLayout layout; 
    private Label lblFlip; 
    private Label lblFlop; 
    private boolean flip = true; 
    private Button buttonFlop; 
    private Button buttonPrint; 

    /** 
    * Prints the control into an image 
    * 
    * @param control 
    */ 
    protected void print(Control control) { 
     Image image = new Image(control.getDisplay(), control.getBounds()); 
     GC gc = new GC(image); 
     try { 
      // As soon as this code is called, calling "layout" on the controls 
      // causes them to disappear. 
      control.print(gc); 
     } finally { 
      gc.dispose(); 
     } 
    } 

    /** 
    * Swaps the controls in the stack 
    */ 
    private void flipFlop() { 
     if (flip) { 
      flip = false; 
      layout.topControl = lblFlop; 
      buttonFlop.setText("flop"); 
      stack.layout(); 
     } else { 
      flip = true; 
      layout.topControl = lblFlip; 
      buttonFlop.setText("flip"); 
      stack.layout(); 
     } 
    } 

    private void createContents(Shell shell) { 
     shell.setLayout(new GridLayout(2, true)); 
     stack = new Composite(shell, SWT.NONE); 
     GridData gdStack = new GridData(GridData.FILL_BOTH); 
     gdStack.horizontalSpan = 2; 
     stack.setLayoutData(gdStack); 
     layout = new StackLayout(); 
     stack.setLayout(layout); 
     lblFlip = new Label(stack, SWT.BOLD); 
     lblFlip.setBackground(Display.getCurrent().getSystemColor(
       SWT.COLOR_CYAN)); 
     lblFlip.setText("FlIp"); 
     lblFlop = new Label(stack, SWT.NONE); 
     lblFlop.setBackground(Display.getCurrent().getSystemColor(
       SWT.COLOR_BLUE)); 
     lblFlop.setText("fLoP"); 
     layout.topControl = lblFlip; 
     stack.layout(); 
     buttonFlop = new Button(shell, SWT.FLAT); 
     buttonFlop.setText("Flip"); 
     GridData gdFlip = new GridData(); 
     gdFlip.horizontalAlignment = SWT.RIGHT; 
     buttonFlop.setLayoutData(gdFlip); 
     buttonFlop.addSelectionListener(new SelectionAdapter() { 
      @Override 
      public void widgetSelected(SelectionEvent e) { 
       flipFlop(); 
      } 

     }); 
     buttonPrint = new Button(shell, SWT.FLAT); 
     buttonPrint.setText("Print"); 
     GridData gdPrint = new GridData(); 
     gdPrint.horizontalAlignment = SWT.LEFT; 
     buttonPrint.setLayoutData(gdPrint); 
     buttonPrint.addSelectionListener(new SelectionAdapter() { 
      @Override 
      public void widgetSelected(SelectionEvent e) { 
       print(lblFlip); 
       print(lblFlop); 
      } 
     }); 

    } 


    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Shell shell = new Shell(); 
     shell.setText("Slider Test"); 
     shell.setSize(new Point(800, 600)); 
     shell.setLayout(new GridLayout()); 
     SWTImagePrintTest tt = new SWTImagePrintTest(); 
     tt.createContents(shell); 
     shell.open(); 
     Display display = Display.getDefault(); 
     while (shell.isDisposed() == false) { 
      if (display.readAndDispatch() == false) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 
} 
+0

請注意,它似乎完全與控制不在Win7 Aero的堆棧頂部。如果我將它彈出到堆棧頂部,那麼我可以在沒有問題的情況下打印它。但是,在將其從屏幕上滑出之前,它會閃爍。 – GreenKiwi 2010-03-10 09:15:45

回答