Calendar
   1234
567891011
12131415161718
19202122232425
2627282930  
<< September 2010 >>
Recent Comments
Recent Trackback
Categories
Archives
Recommend
Recommend
たのしいCocoaプログラミング[Leopard対応版]
たのしいCocoaプログラミング[Leopard対応版]
木下 誠
iPhone開発に役立つぞ!
Recommend
詳解 Objective-C 2.0
詳解 Objective-C 2.0
荻原 剛志
世界一詳しいObjective-Cの本
Links
Member's Blog
Others
Profile
<< シイラを囲む飲み会 | main | まさにその通り!! >>
オリジナル 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覚え書き | 16:00 | comments(0) | trackbacks(1) |







http://blog.cocoa-study.com/trackback/292168
Mail.appスタイルのPopUpMenuButtonについて
オリジナル PopUpMe­nuButtonをもとに、NSBut­tonからPopUpMenu­を作ってみたところ、Mail­.appのPopUpMenu­とは挙動がどうしても同じにならなかった。画面の下­の方でメニューを
| stick stack | 2007/02/26 7:17 AM |