ページ

2008年5月27日火曜日

RubberBand(その32)ThinButton改良(2)

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

前回の続き。今回はコード解説。

まずボタンが2つのイメージを扱えるようにメンバ変数とイニシャライザを変更する。
ThinButton.h

@interface ThinButton : NSObject {

NSImage *_image1;
NSImage *_image2;
:
}
- (id)initWithImage:(NSImage*)image1 alterImage:(NSImage*)image2 frame:(NSRect)frame tag:(UInt)tag;
- (NSImage*)image;
- (NSImage*)alterImage;


上記に合わせてThinButton.mの実装を変更した上でボタンを管理する ThinButtonBarクラスを書き直す。こちらもイニシャライザを2つの画像に対応させる。
ThinButtonBar.h
- (void)addButtonWithImageResource:(NSString*)resource alterImageResource:(NSString*)resource2 tag:(UInt)tag;

alter が2つ目の画像を表す。実装では1つ目の画像同様に画像を作り、ThinButtonのインスタンスを作っているだけ。

そして描画コードでこの2つの画像を使い分けるようにする。
- (void)drawRect:(NSRect)rect {

[NSGraphicsContext saveGraphicsState];
[_shadow set];

NSImage *image;
CGFloat alpha;
for (ThinButton *button in _list) {
switch ([button state]) {
case TB_STATE_NORMAL:
image = [button alterImage];
alpha = 1.0;
break;
case TB_STATE_OVER:
alpha = 1.0;
image = [button image];
break;
case TB_STATE_PUSHED:
alpha = 0.75;
image = [button image];
break;
}

[image drawAtPoint:[button frame].origin
fromRect:NSZeroRect
operation:NSCompositeSourceOver
fraction:alpha];
:
:

通常状態(TB_STATE_NORMAL)の時には、alterImage(不透明度100%)を使い、マウスオーバー時に image(不透明度100%)を使っている。ボタンがおされた時は imageを不透明度のみ変えて使い回している。

- - - -
大分形になってきた。