ページ

2010年4月8日木曜日

NSView で半透明な塗りつぶし

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

NSView で半透明な塗りつぶしを描きたい。

こんなやつ。

WEBアプリによくあるやつで、操作中のウィンドウに覆いかぶさるようにしたい。


サンプルを作ってみた。
検証のためいろいろ盛ってあるが、左の黒い半透明なのが目的の NSView(のサブクラス)。

NSViewのサブクラスを作って普通に描画すると半透明にならない。

- (void)drawRect:(NSRect)dirtyRect {
[[NSColor colorWithDeviceWhite:0.0 alpha:0.75] set];
NSRectFill(dirtyRect);
}

NSView を半透明にするには Compsiting Operation を変えてやる必要がある。塗りつぶしの場合は NSRectFillUsingOperation を使うといい。

- (void)drawRect:(NSRect)dirtyRect {
[[NSColor colorWithDeviceWhite:0.0 alpha:0.75] set];
NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
}
すると半透明になる。


もっと一般的な描画(NSBezierPathなど)には -[NSGracphigContext setCompositingOperation:] を使い設定する。


Compositing Operation については下記のドキュメントで解説されている。
NSGraphicsContext Class Reference

ここによるとデフォルトは NSCompositSourceOver になっているとのことだが NSRectFill はそうなっていない。

Cocoa Drawing Guide: Graphics Contexts

- - - -
半透明ビュー下のテキストボックスやボタンはそのままだと反応してしまう。マウスイベントは mouseDown: を拾えばいいのだが、キー入力はどうやって遮断するのか。