2009-11-03 14 views
11

OS Xでウィンドウタイトルバーを描画する方法をカスタマイズしたいと思います。具体的には、カスタムクローズボタン、最小/最大ボタン、ウィンドウがないところでTwitterrificアプリケーションのようにしたいと思いますタイトルテキストは右詰めです。 Twitterrificとは違って、私はウィンドウ全体をカスタム描画するつもりはありません(私はそれに完全に反対していませんが)。Objective-Cのウィンドウタイトルバーをカスタム描画する方法は?

Appleが提供しているRoundTransparentWindowサンプルと同様に、Cocoa With LoveのRoundWindowサンプルを見てきましたが、いずれも適切ではないようです。

答えて

6

境界線のないウィンドウクラスを使用しない場合は、いくつかのことができます。

最初に、-[NSWindow standardWindowButton:]を使用して購入するクローズ/最小/最大ボタンをカスタマイズすることができます。一度ボタンを取得すると、それを配置/削除/ etc ...

タイトルを@""に設定することで、タイトルをカスタマイズできます。次に、NSTextFieldを追加して、次のようにして独自のタイトルを描くことができます。[[[NSWindow contentView] superview] addSubview:textField]

これはおそらく最も簡単な方法です。これを行うには

もう一つの方法は、など、すべてのウィンドウのタイトルバーを描画するビューをカスタマイズすることです...

NSWindowのコンテンツのビューのは、「テーマビュー」内にあります。テーマビューをサブクラス化して独自の描画を行うことができます。唯一の問題は、テーマ・ビューがプライベート・クラスであるため、注意する必要があることです。

+0

ありがとう、Leibowitzn。 NSTextFieldを設定する方法についてさらに詳しく説明できますか?どのようにフレームをフレーム内に適切に配置するようにフレームを設定するのですか?そして、私のコードのどこでこれを行うのが最適な場所ですか? – sam

+0

FWIW、私はアプリコントローラーのawakeFromNibメソッドでそれを行いました。私はテキストフィールドのフレームをウィンドウのフレームに合わせて配置しました。これはおそらく最善の方法ではありませんが、ウィンドウがいつ/メインウィンドウを終了し、テキストの色を変更するために使用されたかを知るために通知を使用しました。アイデアをもう一度ありがとう。 – sam

5

cocoadevは、独自のNSWindowサブクラスを実装するのに最適な方法についてさらに詳しく説明します。ほとんどの一般的な落とし穴の説明があります。

それの要旨はNSWindowのサブクラスを作成することで、initメソッドでNSBorderlessWindowMaskにそのstyleMaskを設定する:あなたはおそらくあなたの窓の振る舞いをするためにcanbecomeKeyWindowにYESを返す必要があります

- (id) initWithContentRect: (NSRect) contentRect 
       styleMask: (unsigned int) aStyle 
        backing: (NSBackingStoreType) bufferingType 
        defer: (BOOL) flag 
{ 
    if ((self = [super initWithContentRect: contentRect 
           styleMask: NSBorderlessWindowMask 
            backing: bufferingType 
            defer: flag]) == nil) { return nil; } 

    [super setMovableByWindowBackground:YES]; 
    [super setLevel:NSNormalWindowLevel]; 
    [super setHasShadow:YES]; 
    // etc. 

    return self; 
} 

注意を通常のウィンドウのように。

- (BOOL) canBecomeKeyWindow 
{ 
    return YES; 
} 

あなたは、その後、カスタムNSViewのサブクラスを作成したクラスのインスタンスでウィンドウ全体を満たし、かつ、そのカスタムビュー内から描画適切なウィンドウのすべてを実行することができます。

すべてが少し痛いことがあります。右下隅をドラッグしてサイズを変更するなど、通常のウィンドウ動作のほとんどを再実装する必要があります。

+0

ありがとう、eJames。あなたはこのアプローチ(これまで私が始めていた)が苦痛を感じることは間違いありません。完全なカスタマイズを探しているわけではないので、私はそれを避けることを望んでいました。ウィンドウの標準機能のすべてを実装する必要はありません。このアプローチは基本的に私の質問で参照されているサンプルで使用されているものです。このアプローチの1つの奇妙な側面は、ウィンドウの影が正しく動作しないように見えるということです。標準的なウィンドウの影ほど暗くはなく、フォーカスが変わっても変化しません。私はこれがボーダーレスウィンドウスタイルのバグかもしれないと思う。 – sam

+0

影の問題は奇妙です。 Leibowitznの答えがあなたのために行く方法かもしれないように聞こえる。それと幸運! –

+0

シャドー問題は長年にわたる問題です。 Appleは、キーボードフォーカスのある枠のないウィンドウでは、より暗い影を描きません。スティッキーを見てみましょう。 Appleによると、これを回避するには、通常のウィンドウタイプを使用して、自分のすべての描画を行うことをお勧めします。 – Leibowitzn

2

CoreData Stickiesサンプルプロジェクトにカスタムウィンドウの実装例があります。

関連する問題