SEARCH THIS BLOG
CATEGORIES
ARCHIVES
RECOMMENDED OS X APP

Desktop Calendar Plus
App

Textastic
App

Tap Forms Organizer 5 + Secure Database
App

OmniFocus 2
App

RECOMMENDED iPad APP

GitMongo
App


RECOMMENDED UNIVERSAL APP

Textastic Code Editor 6
App

OmniFocus 2
App

iTeleport VNC AND RDP
App


Tap Forms Organizer 5 + Secure Database
App

LINKS

透明のNSWindow

最近透明のウインドウを定期的に作っているのですが、透明の NSWindow は、styleMaskにNSBorderlessWindowMask を指定し、setBackgroundColor に clearColor をセットして作ります。

self = [super initWithContentRect:rect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
		
if (self) {
	[self setBackgroundColor:[NSColor clearColor]];
	[self setOpaque:NO];
}

さて、ここで問題となってくるのが、ウインドウのリサイズや、透明部分をドラッグしてのウインドウの移動です。
リサイズは、NSBorderlessWindowMask を指定すると、タイトルバーが消える為、リサイズインジケータをYESにしてもリサイズインジケータは表示されず、リサイズできません。
なので、自分で実装します。

ウインドウの透明部分のドラッグですが素直にリファレンスを読んで、これを実装します。

// 背景をドラッグして移動することができるかをセットします
[window setMovableByWindowBackground:YES];

マウスイベントを拾うように、

[window setIgnoresMouseEvents:NO];

も実装します。

そして

- (void)mouseDragged:(NSEvent*)event {}

にリサイズ用のコードを書きます。

でもこの実装だと、ウインドウをリサイズした際にウインドウ全体がぷるんぷるんするんですよねw
Cocoaアプリケーションの様に上部固定でリサイズ出来ますが、ドラッグ中はウインドウがぷるんぷるんします。

何故かと言うと

// 背景をドラッグして移動することができるかをセットします
[window setMovableByWindowBackground:YES];

これが原因です。僕は毎回ハマりますw いい加減憶えろという話ですが、透明ウインドウなんてそんなに作る物ではないし、忘れがちなんですね〜。

さて、NSWindow の挙動が10.7から変わっています。
僕としては NSWindow に望んでた変更がされています。
透明ウインドウを作る際に、NSBorderlessWindowMask を指定せずに NSResizableWindowMask を指定し、クリアカラーをセットすると完全に透明なウインドウが出来るようになっています。
タイトルバーも透明になります。

今まで通り、NSBorderlessWindowMask で良いじゃないかと思いますが、リサイズの実装を自分で書かなくて良いので大変楽です。
上下、左右、インジケータ部分でのリサイズ、アスペクト比を保ってのリサイズを書かなくてすみます。
素晴らしい!

| Cocoa, Objective-C, Programming | Permalink | コメント (0) | Trackback(0) |
 
TRACKBACK
このエントリーのトラックバックURL:
http://hyslog.com/blog/2012/07/11/804/trackback

コメントはお気軽にどうぞ



« | メイン | »