如何在设备缩放设置超过 175% 的情况下绘制图像?

问题描述 投票:0回答:0

我想在 Windows10 上打印前显示模型预览。我的对话窗口:

protected Control createDialogArea( Composite parent )
  {
    mvSelectionDisabled = modelviewsDisabled();
    setTitle( DialogTitle );
    getShell().setText( DialogHeader );

    parent.setLayout( new GridLayout(1, false) );

    SashForm intParent = new SashForm( parent, SWT.NONE );
    intParent.setLayout( new GridLayout(2, false) );
    GridData intData = new GridData( SWT.FILL, SWT.FILL, true, true );
    intData.horizontalIndent = 0;
    intData.verticalIndent = 0;
    intParent.setLayoutData( intData );

    GridData gridData = new GridData( GridData.FILL, GridData.FILL, true, true );

    tabFolder = new TabFolder( intParent, SWT.TOP );
    tabFolder.setLayoutData( gridData );
    if( !tabHtmlOnly ) {
      tabFolder.addSelectionListener( new SelectionAdapter() {
        @Override
        public void widgetSelected( SelectionEvent e ) {
          // some code
          refreshPreview( );
          // some code
        }
      } );
    }

    Composite previewComp = new Composite( intParent, SWT.NONE );
    previewComp.setLayout( new GridLayout( ) );
    GridData previewData = new GridData( SWT.FILL, SWT.FILL, true, true );
    previewData.horizontalIndent = -5;
    previewData.verticalIndent = -5;
    previewComp.setLayoutData( previewData );

    ToolBar previewButtonsToolbar = new ToolBar( previewComp, SWT.FLAT | SWT.HORIZONTAL );
    previewButtonsToolbar.setLayoutData( new GridData( SWT.BEGINNING, SWT.TOP, true, false ) );

    // some code

      tabFolder.pack();
    //some code
    preview = new PrintPreview( previewComp, SWT.NONE );

    GridData previewLayoutData = new GridData( GridData.FILL, GridData.FILL, true, true );
    previewLayoutData.widthHint = 450;
    previewLayoutData.heightHint = 600;

    preview.setLayoutData( previewLayoutData );

    // some code
    refreshPreview( true );
    setMessage( DialogMessage, IMessageProvider.INFORMATION );

    return parent;
  }

虽然监视器缩放设置为 150%,

org.eclipse.swt.internal.DPIUtil.getDeviceZoom()
返回
100
并且一切正常。但如果缩放设置为 175% 或更高,
org.eclipse.swt.graphics.GC.drawImage(Image, int, int, int, int, int, int, int, int)
抛出
SWT.ERROR_INVALID_ARGUMENT
。如果设备缩放 = 200,则存在条件
int errX = src.x + src.width - b.width;
并且
src.width
始终是
b.width
的两倍。

我真的不知道该如何处理。感谢您的任何想法!

绘图图标效果很好,请参阅堆栈:

org.eclipse.swt.graphics.GC.drawImage(org.eclipse.swt.graphics.Image, int, int, int, int, int, int, int, int) line: 934 
org.eclipse.swt.widgets.Tree.CDDS_ITEMPOSTPAINT(org.eclipse.swt.internal.win32.NMTVCUSTOMDRAW, long, long) line: 781    
org.eclipse.swt.widgets.Tree.wmNotifyChild(org.eclipse.swt.internal.win32.NMHDR, long, long) line: 7372 
org.eclipse.swt.widgets.Composite(org.eclipse.swt.widgets.Control).wmNotify(org.eclipse.swt.internal.win32.NMHDR, long, long) line: 5809    
org.eclipse.swt.widgets.Composite.wmNotify(org.eclipse.swt.internal.win32.NMHDR, long, long) line: 1989 
org.eclipse.swt.widgets.Composite(org.eclipse.swt.widgets.Control).WM_NOTIFY(long, long) line: 5367 
org.eclipse.swt.widgets.Composite(org.eclipse.swt.widgets.Control).windowProc(long, int, long, long) line: 4824 
org.eclipse.swt.widgets.Display.windowProc(long, long, long, long) line: 4770   
org.eclipse.swt.internal.win32.OS.CallWindowProc(long, long, int, long, long) line: not available [native method]   
org.eclipse.swt.widgets.Tree.callWindowProc(long, int, long, long) line: 1554   
org.eclipse.swt.widgets.Tree(org.eclipse.swt.widgets.Control).windowProc(long, int, long, long) line: 4867  
org.eclipse.swt.widgets.Tree.windowProc(long, int, long, long) line: 5962   
org.eclipse.swt.widgets.Display.windowProc(long, long, long, long) line: 4770   
org.eclipse.swt.internal.win32.OS.DispatchMessage(org.eclipse.swt.internal.win32.MSG) line: not available [native method]   
org.eclipse.swt.widgets.Display.readAndDispatch() line: 3545    

画图不同,看栈:

org.eclipse.swt.graphics.GC.drawImage(org.eclipse.swt.graphics.Image, int, int, int, int, int, int, int, int) line: 936 
org.eclipse.nebula.paperclips.core.ImagePiece.paint(org.eclipse.swt.graphics.GC, int, int) line: 246    
org.eclipse.nebula.paperclips.core.ScalePiece.paint(org.eclipse.swt.graphics.GC, int, int) line: 246    
org.eclipse.nebula.paperclips.core.CompositePiece.paint(org.eclipse.swt.graphics.GC, int, int) line: 116    
org.eclipse.nebula.paperclips.core.CompositePiece.paint(org.eclipse.swt.graphics.GC, int, int) line: 116    
org.eclipse.nebula.paperclips.core.CompositePiece.paint(org.eclipse.swt.graphics.GC, int, int) line: 116    
org.eclipse.nebula.paperclips.core.CompositePiece.paint(org.eclipse.swt.graphics.GC, int, int) line: 116    
org.eclipse.nebula.paperclips.core.CompositePiece.paint(org.eclipse.swt.graphics.GC, int, int) line: 116    
org.eclipse.nebula.paperclips.widgets.PrintPreview.paintPage(org.eclipse.swt.widgets.Event, org.eclipse.nebula.paperclips.core.PrintPiece, org.eclipse.swt.graphics.Point) line: 460    
org.eclipse.nebula.paperclips.widgets.PrintPreview.paint(org.eclipse.swt.widgets.Event) line: 426   
org.eclipse.nebula.paperclips.widgets.PrintPreview.access$0(org.eclipse.nebula.paperclips.widgets.PrintPreview, org.eclipse.swt.widgets.Event) line: 404    
org.eclipse.nebula.paperclips.widgets.PrintPreview$1.handleEvent(org.eclipse.swt.widgets.Event) line: 87    
org.eclipse.swt.widgets.EventTable.sendEvent(org.eclipse.swt.widgets.Event) line: 89    
org.eclipse.swt.widgets.Display.sendEvent(org.eclipse.swt.widgets.EventTable, org.eclipse.swt.widgets.Event) line: 4131 
org.eclipse.nebula.paperclips.widgets.PrintPreview(org.eclipse.swt.widgets.Widget).sendEvent(org.eclipse.swt.widgets.Event) line: 1055  
org.eclipse.nebula.paperclips.widgets.PrintPreview(org.eclipse.swt.widgets.Widget).sendEvent(int, org.eclipse.swt.widgets.Event, boolean) line: 1079    
org.eclipse.nebula.paperclips.widgets.PrintPreview(org.eclipse.swt.widgets.Widget).sendEvent(int, org.eclipse.swt.widgets.Event) line: 1064 
org.eclipse.nebula.paperclips.widgets.PrintPreview(org.eclipse.swt.widgets.Composite).WM_PAINT(long, long) line: 1564   
org.eclipse.nebula.paperclips.widgets.PrintPreview(org.eclipse.swt.widgets.Control).windowProc(long, int, long, long) line: 4825    
org.eclipse.nebula.paperclips.widgets.PrintPreview(org.eclipse.swt.widgets.Canvas).windowProc(long, int, long, long) line: 348  
org.eclipse.swt.widgets.Display.windowProc(long, long, long, long) line: 4778   
org.eclipse.swt.internal.win32.OS.DispatchMessage(org.eclipse.swt.internal.win32.MSG) line: not available [native method]   
org.eclipse.swt.widgets.Display.readAndDispatch() line: 3545    
    

我在画之前确实尝试过缩放图像,但没有帮助。有一些 answer 可能会有帮助,但我可能不明白如何实施它。

eclipse swt
© www.soinside.com 2019 - 2024. All rights reserved.