ページ

2008年3月7日金曜日

画面キャプチャその7 - タイマー取り込み

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

さてウィンドウ指定、範囲指定と作ったので次はタイマー取り込みを実装する。

今までに比べればこれは簡単。すぐにできた。



ソース:FullScreenSample-7.zip


実行すると画面が暗くなり、左上にカウントダウンの数字が表示いされる。"5 4 3 ..."と数字が減っていき 1になったところで画面全体がキャプチャされる。



PNGファイルが作成される。



カウントダウンには NSTimerを使う。コントローラで NSTimerを仕掛け、ビューのメソッド(fire:)を呼ぶように設定する。

MyController.m

[NSTimer scheduledTimerWithTimeInterval:1.0
target:_fullscreen_view
selector:@selector(fire:)
userInfo:nil
repeats:YES];



ビューでは fire: がよばれたらメンバ変数 _count を1減らし、画面に数字を描画する。

MyView.m
- (void)fire:(NSTimer*)theTimer
{
[self setNeedsDisplay:YES];
_count--;
   :


- (void)drawRect:(NSRect)rect {
   :
NSMutableAttributedString* str = [[NSMutableAttributedString alloc]
initWithString:[NSString stringWithFormat:@"%d", _count]];
[str addAttribute:NSFontAttributeName value:[NSFont fontWithName:@"Arial" size:72]
range:NSMakeRange(0, 1)];
[str addAttribute:NSForegroundColorAttributeName value:[NSColor whiteColor]
range:NSMakeRange(0, 1)];
[[NSColor whiteColor] set];
[str drawAtPoint:NSMakePoint(50, 50)];
}



_count == 0になったら画面全体のキャプチャを撮る。

CGWindowID window_id = (CGWindowID)[[self window] windowNumber];
CGImageRef cgimage = CGWindowListCreateImage(CGRectInfinite, kCGWindowListOptionOnScreenBelowWindow, window_id, kCGWindowImageDefault);
NSBitmapImageRep *bitmap_rep = [[NSBitmapImageRep alloc] initWithCGImage:cgimage];
NSData* data = [bitmap_rep representationUsingType:NSPNGFileType
properties:[NSDictionary dictionary]];


CGWindowListCreateImage に CGRectInfinite を渡すと画面全体が対象となる。

- - - -
今回の方法だとカウントダウン中は画面の操作が何もできない。このままではタイマーの意味が無いので次回は、カウントダウン中に操作ができるように改良する。