2

Cocoa-Javaは非推奨であるため、Cocoa-JavaコードをCocoa+JNIに移行しています。このコードは、ファイルに保存されている画像を印刷します。新しいCocoaコードは基本的に次のとおりです。

NSImage *image = [[NSImage alloc] initWithContentsOfFile:spoolFile];
if ( [image isValid] ) {
    NSImageView *view = [[NSImageView alloc] init];
    [view setImage:image];
    [view setImageScaling:NSScaleProportionally];

    NSPoint p;
    NSSize s;

    p.x = static_cast<float>( boundsX );
    p.y = static_cast<float>( boundsY );
    [view setBoundsOrigin:p];

    s.width  = static_cast<float>( boundsWidth );
    s.height = static_cast<float>( boundsHeight );
    [view setBoundsSize:s];

    NSPrintInfo *info = [NSPrintInfo sharedPrintInfo];
    [info setHorizontalPagination:NSClipPagination];
    [info setVerticalPagination:NSClipPagination];
    [info setHorizontallyCentered:NO];
    [info setVerticallyCentered:NO];

    p.x = static_cast<float>( boundsX );
    p.y = static_cast<float>( [info paperSize].height - boundsHeight - boundsY );
    [view translateOriginToPoint:p];

    NSPrintOperation *printOp =
        [NSPrintOperation printOperationWithView:view printInfo:info];
    [printOp setShowsPrintPanel:NO];
    [printOp runOperation];
}

このコードを実行すると、最終的に次のようにクラッシュします。

Thread 0 Crashed:
0   com.apple.AppKit   0x9484ac75 -[NSConcretePrintOperation(NSInternal) _tryToSetCurrentPageNumber:] + 345
1   com.apple.AppKit   0x948d88cf -[NSView(NSPrintingInternal) _printForCurrentOperation] + 524
2   com.apple.AppKit   0x948d85c5 -[NSConcretePrintOperation _renderView] + 358
3   com.apple.AppKit   0x9491f0c0 -[NSConcretePrintOperation runOperation] + 362

なんで?ファイルに保存されている画像を簡単に印刷するにはどうすればよいですか?

4

2 に答える 2

3
NSImageView *view = [[NSImageView alloc] init];

それは無効です。ビューを初期化するために使用する必要がありinitWithFrame:ます。NSZeroPointと画像のサイズで構成されるフレームを渡したいと思うでしょう。

setBoundsOrigin:andの使用に関してはsetBoundsSize:、画像をトリミングするつもりだと仮定すると、それらが機能するかどうかはわかりません。(上記の問題を修正した後)それらを試すことができますが、古いイメージの目的のセクションから新しいイメージを作成する方が安全だと思います。これを行うには、目的のサイズの空の画像を作成し、フォーカスをロックし、古い画像の正しいセクションを新しい画像の原点に描画し、新しい画像のフォーカスをロック解除してから、代わりに新しい画像を指定します。画像ビューに古い。

于 2009-09-16T20:25:41.053 に答える
-1

を に 2 回割り当てたのはタイプミスp.yですか? 2行後まで定義しているようには見えませんinfo...

また、NSMakePoint()NSMakeSize()を手動で構築して使用するのではなく、int を渡すことで使用する方が簡単ではないでしょうstatic_cast<float>か? それは非常にC++のアプローチのようです...

たとえば、このようなものはうまくいくでしょうか?

NSImage *image = [[NSImage alloc] initWithContentsOfFile:spoolFile];
if ([image isValid]) {
    NSPrintInfo *info = [NSPrintInfo sharedPrintInfo];
    [info setHorizontalPagination:NSClipPagination];
    [info setVerticalPagination:NSClipPagination];
    [info setHorizontallyCentered:NO];
    [info setVerticallyCentered:NO];

    NSImageView *view = [[NSImageView alloc] init];
    [view setImage:image];
    [view setImageScaling:NSScaleProportionally];
    [view setBoundsOrigin:NSMakePoint(boundsX, boundsY)];
    [view setBoundsSize:NSMakeSize(boundsWidth, boundsHeight)];
    [view translateOriginToPoint:NSMakePoint(boundsX, [info paperSize].height -
                                                      boundsHeight - boundsY)];

    NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:view printInfo:info];
    [printOp setShowsPrintPanel:NO];
    [printOp runOperation];
}
于 2009-09-16T17:19:27.527 に答える