Mac OS X 10.7.4Mac OS X: Das Zeichnen in einem Offscreen-NSGraphicsContext mit CGContextRef C-Funktionen hat keine Auswirkungen. Warum?
Ich zeichne in einen Offscreen-Grafikkontext, der über +[NSGraphicsContext graphicsContextWithBitmapImageRep:]
erstellt wurde.
Wenn ich in diesem Grafikkontext unter Verwendung der NSBezierPath
Klasse zeichnen, funktioniert alles wie erwartet.
Wenn ich jedoch in diesen Grafikkontext unter Verwendung der CGContextRef
C-Funktionen zeichnen, sehe ich keine Ergebnisse meiner Zeichnung. Nichts funktioniert.
Aus Gründen, auf die ich nicht eingehen werde, muss ich wirklich mit den CGContextRef
Funktionen zeichnen (anstatt der Cocoa NSBezierPath
Klasse).
Mein Codebeispiel ist unten aufgeführt. Ich versuche ein einfaches "X" zu zeichnen. Ein Hub mit NSBezierPath
, ein Hub mit CGContextRef
C-Funktionen. Der erste Strich funktioniert, der zweite nicht. Was mache ich falsch?
NSRect imgRect = NSMakeRect(0.0, 0.0, 100.0, 100.0);
NSSize imgSize = imgRect.size;
NSBitmapImageRep *offscreenRep = [[[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL
pixelsWide:imgSize.width
pixelsHigh:imgSize.height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bitmapFormat:NSAlphaFirstBitmapFormat
bytesPerRow:0
bitsPerPixel:0] autorelease];
// set offscreen context
NSGraphicsContext *g = [NSGraphicsContext graphicsContextWithBitmapImageRep:offscreenRep];
[NSGraphicsContext setCurrentContext:g];
NSImage *img = [[[NSImage alloc] initWithSize:imgSize] autorelease];
CGContextRef ctx = [g graphicsPort];
// lock and draw
[img lockFocus];
// draw first stroke with Cocoa. this works!
NSPoint p1 = NSMakePoint(NSMaxX(imgRect), NSMinY(imgRect));
NSPoint p2 = NSMakePoint(NSMinX(imgRect), NSMaxY(imgRect));
[NSBezierPath strokeLineFromPoint:p1 toPoint:p2];
// draw second stroke with Core Graphics. This doesn't work!
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, 0.0, 0.0);
CGContextAddLineToPoint(ctx, imgSize.width, imgSize.height);
CGContextClosePath(ctx);
CGContextStrokePath(ctx);
[img unlockFocus];
Danke Kurt. Ja, du warst in deiner Annahme richtig, ich versuche, "img" zu diappeln. Außerdem: Ihre Fehlerbehebung ist korrekt und behebt das Problem. Danke für das Aufräumen! –