さてウィンドウ指定、範囲指定と作ったので次はタイマー取り込みを実装する。
今までに比べればこれは簡単。すぐにできた。
ソース: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 を渡すと画面全体が対象となる。
- - - -
今回の方法だとカウントダウン中は画面の操作が何もできない。このままではタイマーの意味が無いので次回は、カウントダウン中に操作ができるように改良する。