ページ

2008年2月21日木曜日

スクラップブックその9 - 画像上にアイコンを表示する

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

マウスカーソルが画像の上に来たら、左上にアイコンを表示するようにする。



ソースコード:sp4-9.zip

このアイコンは他のアプリケーション(ファインダなど)へドラッグ&ドロップして画像をコピーする時につかむ位置を表している。ドラッグ処理は次回へ取っておいて、今回は表示する処理を追加する。


アイコンを管理する為に新しいクラス ItemIcon を追加した。

ItemIcon.h

@interface ItemIcon : NSObject {

NSImage *_image;
int _state;
NSRect _frame;
}
- (id)initWithImage:(NSImage*)image;
- (void)setOrigin:(NSPoint)point;
- (BOOL)inRectAtPoint:(NSPoint)point;
- (void)setState:(int)state; // 0=off/1=on/2=pushed
- (void)draw;
- (NSRect)frame;


ItemIconはアイコン画像と表示位置を保持する。これらの情報を使いマウスポインタがアイコン上にあるかどうかのチェックや、アイコン画像の描画処理を行う。3種類の状態(0=無効、1=画像上にマウスあり、2=アイコン上にマウスあり)を持ち、マウスの位置によって表示の有無や、透明度を変えている。


WorkView はこのインスタンスを変数として持ち、マウスポインタの位置などによって状態を制御する。

WorkView
- (void)mouseMoved:(NSEvent *)theEvent
{
   :
   :
[_icon setOrigin:[_mouseon_item rect].origin];
if ([_icon inRectAtPoint:cp]) {
[_icon setState:2];    // 2: アイコンの上にマウスがある
} else if (_mouseon_item) {
[_icon setState:1];    // 1: 画像の上にマウスがある(しかしアイコンの上には無い)
} else {
[_icon setState:0];    // 0: 画像の上にマウスが無い
}

[self setNeedsDisplayInRect:[_mouseon_item rect]];
[self setNeedsDisplay:YES];
}


マウス移動のイベントハンドラ(mouseMoved:)内でマウスポインタをチェックし、状態を決めている。そして drawRect: 内で描画する。これは ItemIcon#draw を呼び出すだけで良い。


アイコン画像はバンドル内に配置し、アプリ起動時に MyController がこれを読み込み NSImageクラスのインスタンスとして作成する。

MyController.m
- (void)awakeFromNib
{
   :
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
NSArray* paths = [[NSBundle mainBundle] pathsForResourcesOfType:@"png"
inDirectory:nil];
for (NSString* file in paths) {
NSImage *image = [[[NSImage alloc] initWithContentsOfFile:file] autorelease];
[dict setObject:image forKey:[[file lastPathComponent] stringByDeletingPathExtension]];
}
_icons = [dict retain];
}


NSDictionary へ名前付きで入れておき、WorkViewが ItemIconを作成する時に取り出して使う。

- - - -

次回はこのアイコンをドラッグして別アプリ(ファインダなど)へコピーする処理を追加する。