ページ

2008年5月15日木曜日

ThinButton(その2)

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

カスタムボタンのコード解説。

ボタンは NSView のサブクラスとして実装する。

ThinButton.h

@interface ThinButton : NSView {

NSImage *icon;
NSRect icon_frame;
NSTrackingArea* icon_tracking_area;
int state;
}
@end

メンバ変数として、表示するアイコン画像(icon)、表示領域(icon_frame)、マウストラッキングエリア、そしてボタンの状態(state)を用意する。

次に実装コード。まずはアイコン画像から。
ThinButton.m
- (id)initWithFrame:(NSRect)frame {
:
NSString *file = [[NSBundle mainBundle] pathForResource:@"icon_cancel"
ofType:@"png"];
icon = [[NSImage alloc] initWithContentsOfFile:file];}
:
:

初期化の時に NSImageを作っておく。画像はあらかじめバンドル内に用意しておく(開発時にXCodeプロジェクトへ加えておけば自動的にアプリケーション内にバンドルされる)。

描画は drawAtPoint: を使う。ボタンの状態(state)によって透明度を変える。
- (void)drawRect:(NSRect)rect {
CGFloat alpha;
switch (state) {
case 0:
alpha = 0.25;
break;
default:
alpha = 1.0;
break;
}
[icon drawAtPoint:icon_frame.origin
fromRect:NSZeroRect
operation:NSCompositeSourceOver
fraction:alpha];
}


これでアイコンが表示されるようになった。次はマウスカーソルオーバー時の処理。NSTrackingAreaを使う。これは以前ブログで紹介した。

初期化コード内で NSTrackingAreaを作成し、NSViewへ登録する。
- (id)initWithFrame:(NSRect)frame {
:

icon_tracking_area = [[NSTrackingArea alloc] initWithRect:icon_frame
options:(NSTrackingMouseEnteredAndExited|NSTrackingActiveInKeyWindow)
owner:self
userInfo:nil];
[self addTrackingArea:icon_tracking_area];
:


これでマウスカーソルオーバー時に mouseEntered: と mouseEnteredExited: が呼び出されるようになる。
- (void)mouseEntered:(NSEvent *)theEvent {
if (state == 0) {
[self changeState:1];
}
}
- (void)mouseExited:(NSEvent *)theEvent {
if (state == 1) {
[self changeState:0];
}
}


状態変更はメソッド化して併せて再描画要求も出すようにしておく。
- (void)changeState:(int)aState
{
state = aState;
[self setNeedsDisplayInRect:icon_frame];
[self setNeedsDisplay:YES];
}