ページ

2008年8月18日月曜日

マウスカーソルのキャプチャ (4)

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

次はグラブ(Grab.app)方式を考えてみる。NSCursorを使うとシステムが使用しているマウスカーソルの画像が簡単に取得できる。
NSCursor Class Reference

カーソルを取得するためのクラスメソッド:

+ currentCursor  
+ arrowCursor
+ closedHandCursor
+ crosshairCursor
+ disappearingItemCursor
+ IBeamCursor
+ openHandCursor
+ pointingHandCursor
+ resizeDownCursor
+ resizeLeftCursor
+ resizeLeftRightCursor
+ resizeRightCursor
+ resizeUpCursor
+ resizeUpDownCursor


メソッドで取得できる画像を一覧するサンプルを作ってみた。NSCollectionViewを使うと簡単に一覧表示できる(NSCollectionViewの使い方は過去のブログを参照)。



画像とメソッド名称、ホットスポット位置(hotSpotの戻り値: NSPoint)を表示している。

ソース:MousePointer-2.zip


AppController で配列 (NSMutableArray)を用意し、そこへ個々のカーソル毎の情報を用意した NSMutableDictionaryを入れていく。NSMutableDictionaryのキーは @"image", @"name", @"hotSpot"としている。

AppController.m
- (id)init
{
self = [super init];
if (self) {
cursors = [[NSMutableArray alloc] init];
NSCursor* cursor;
cursor = [NSCursor arrowCursor];
[cursors addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:[cursor image], @"image", @"arrowCursor", @"name", NSStringFromPoint([cursor hotSpot]), @"hotSpot", nil]];
     :
     :


↑↑ メソッドの分だけベタに記述しているが、 vi などのマクロを使えばメソッドの数が多くとも簡単に記述できる。

一旦データが用意できれば、後は InterfaceBuilder上のバインディング設定だけで表示できる。本当に良くできている。ただ欲を言えばOutlet/Action同様にマウスドラッグでバインディングが設定できると便利なのだが。

- - - -
この数回の検証で、プライベート関数利用など問題はあるが画像を取る方法はわかった。次はこれをどうスクリーンキャプチャへ合成するかだ。これは意外と面倒な予感がする。