2005.09.20 Tuesday
オリジナル PopUpMenuButton
|
よく下のような図のポップアップメニューボタンを見かける。
![]() 上の例は Mail.app のボタンの例だが、一般のポップアップボタンのように選択されているメニューが表示されるタイプではなく、単にメニューがプルダウンされる形のボタンだ。一見NSPopUpButtonの属性などで簡単に作れそうだが、実はそうではない。 たしかに、NSPopUpButtonにはアクア的なイメージを付けないようにするという属性はあるが、オリジナルイメージに対してプルダウンさせる仕組みがどうやらない。setImageを行っても変化はない。じゃ、どうやっているのかとアップルのアプリのリソースなどを調べてみると、NSPopUpButtonを拡張しているのではなく、NSButtonを拡張させているだけだった。NSButtonにはメニューなどをセットできるので、それをマウスクリックと同時呼び出し、ボタンの直下に表示させるという手順だ。 具体的なソースはこうだ! @interface MyPopUpButton : NSButton { } @end @implementation MyPopUpButton - (void)mouseDown:(NSEvent *)theEvent { NSEvent *aMenuEvent; NSPoint aMenuLoc; // Viewに合わせてメニューを表示させる場所を再計算 aMenuLoc = NSMakePoint(...,....); // 新しいイベントを作り(ほとんどが継承で、場所だけ変更) aMenuEvent = [ NSEvent mouseEventWithType:[ theEvent type ] location: aMenuLoc modifierFlags:[ theEvent modifierFlags ] timestamp:[ theEvent timestamp ] windowNumber:[ theEvent windowNumber ] context:[ theEvent context ] eventNumber:[ theEvent eventNumber ] clickCount:[ theEvent clickCount ] pressure:[ theEvent pressure ]]; // ボタンをハイライトさせる [ self highlight:YES ]; // ポップアップメニューを表示させる [ NSMenu popUpContextMenu:[ self menu ] withEvent:aMenuEvent forView:self ]; // ハイライトを戻す [ self highlight:NO ]; } @end マウスダウンされたら、メニューを表示させる場所を計算してその場所にマウスダウンイベントを発生させ、ポップアップメニューを表示させるのだ。新しいイベントは、マウスダウンから着たイベントをほぼそのまま継続し、クリック位置だけを変更させればいい。あとは、ボタンのハイライト処理をすれば、それっぽい動作をするようになる。 ただ、この動作を行うためだけにNSButtonをオーバーライドしなきゃいけないのが面倒って言えば面倒だけど… 他にもっと楽な方法ないかな〜? |
||



![たのしいCocoaプログラミング[Leopard対応版]](http://ecx.images-amazon.com/images/I/31jKj%2BBWJIL._SL160_.jpg)

