スタイルNSBorderlessWindowMask(タイトルバーなし)のNSWindowを備えたCocoaアプリケーションがあります。ウィンドウ内に画像を配置したいのですが、画像の一部をウィンドウの外に配置する必要があります。
これはどのように行うことができますか?
スタイルNSBorderlessWindowMask(タイトルバーなし)のNSWindowを備えたCocoaアプリケーションがあります。ウィンドウ内に画像を配置したいのですが、画像の一部をウィンドウの外に配置する必要があります。
これはどのように行うことができますか?
あなたがやりたいことに関連して見つけた2つの記事を次に示します。
要点は、NSWindow をサブクラス化して境界のない透明なウィンドウにし、カスタム形状を描画するサブビューを作成して、それをウィンドウのコンテンツ ビューにすることです。
サンプルの外観から、影はまだ適用されているはずです。ココアウィズラブ より:
ウィンドウの背後にある影は、描画する形状に合わせて自動的に描画されます。ウィンドウのどの部分も完全に空のままにしておくと、マウス クリックを受け付けなくなります (クリックはウィンドウから落ちます)。
境界線を描画するには、ビュー クラスの表示メソッドで次のようにします。
NSBezierPath* border = [NSBezierPath bezierPathWithRect:self.frame];
[border setLineWidth: 1.0];
[[NSColor windowFrameColor] set];
[border stroke];
カスタム ビュー クラスがない場合は、[view lockFocus];
そのパスを実行する前に実行self
し、ビュー インスタンスに置き換えます。描いた後は必ず[view unlockFocus];
に関するドキュメントからの重要なメッセージlockFocus
:
ワンショット ウィンドウを非表示または縮小すると、そのウィンドウのバッキング ストアが解放されます。描画に標準の表示メカニズムを使用しない場合、ウィンドウが縮小または非表示のときに描画する可能性がある場合は、lockFocus ではなく lockFocusIfCanDraw を使用する必要があります。
確実に影を維持する別の方法は、2 つのウィンドウを使用し、一方を他方の子にすることです。
さまざまな理由でウィンドウの外に描画することはできません。特に、プロセスが描画先のプロセスを所有または許可する必要があるためです (他の多くの理由も)。