ページ

2008年3月5日水曜日

画面キャプチャその5 - 選択範囲をキャプチャ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

次はウィンドウではなく任意の選択範囲をキャプチャする。



実行すると画面が暗くなり、マウスのドラッグで範囲選択する。選択が終わると画像を保存し終了する。

ソース:FullScreenSample-5.zip


まずは範囲選択から。これは以前スクラップブックのドラッグで紹介した方法ですんなりと行く。

MyView.m

- (void)mouseDown:(NSEvent *)theEvent
{
NSPoint current_point, start_point;
start_point = [self convertPoint:[theEvent locationInWindow]
fromView:nil];
NSEvent *event;

while (1) {
event = [[self window] nextEventMatchingMask:(NSLeftMouseDraggedMask|NSLeftMouseUpMask)];
current_point = [self convertPoint:[event locationInWindow]
fromView:nil];

_spot_rect.size.width = fabs(start_point.x - current_point.x);
_spot_rect.size.height = fabs(start_point.y - current_point.y);
_spot_rect.origin.x = fmin(start_point.x, current_point.x);
_spot_rect.origin.y = fmin(start_point.y, current_point.y);
[self setNeedsDisplay:YES];

if ([event type] == NSLeftMouseUp) {
break;
}
}
  :


マウスボタンが押されたらその位置を記録(start_point)した後、イベントループを構成する。そしてマウスの動きに合わせてハイライト領域 _spot_rect を更新する。

- (void)drawRect:(NSRect)rect {
[[NSColor colorWithDeviceRed:0.0 green:0.0 blue:0.0 alpha:0.75] set];
NSRectFill(rect);

[[NSColor clearColor] set];
NSRectFill(_spot_rect);
}


drawRect: では、下地となる半透明の黒で全体を塗りつぶした後、_spot_rect の領域だけ clearColor(透明色)にする。これでハイライト表示になる。


これで領域選択と視覚効果ができた。最後に選択範囲を画像ファイルとして書き出す。今回は NSBitmapImageRep#initWithFocusedViewRect: を使ってみた。

 [self lockFocus];
NSBitmapImageRep *bitmap_rep =[[NSBitmapImageRep alloc] initWithFocusedViewRect:_spot_rect];
[self unlockFocus];


実行してみる。



ん?うまくいかない。initWithFocusedViewRect: はあくまでもビュー上に描画された内容だけが対象のようだ。下が透けていけてもそこは拾ってくれないようだ。

さてどうするか。CGWindowListCreateImage( ) が使えそうだが。