ページ

2009年1月10日土曜日

マルチスクリーン対応(4)Selection編(2)

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

まずスクリーンの状態を管理するクラス Screen を用意する。管理する、といっても大したことはやっていなくて現時点でのスクリーンの大きさの総和を取った NSRect を返すクラスメソッドが実装されているだけ。
Screen.m

+ (NSRect)frame;
{
NSArray* screen_list = [NSScreen screens];
NSRect frame;

for (NSScreen* screen in screen_list) {
NSRect sf = [screen frame];
frame = NSUnionRect(frame, sf);
}

return frame;
}


これをキャプチャで使っているウィンドウ(CaptureWindow)とビュー(CaptureView)の大きさとして設定する。Selectionではこれらの frame を範囲判定に使っているので、これだけで基本的な対応はできてしまう。


なおスクリーンの状態は、新規にディスプレイをつなげたり、解像度を変更したりすることによって変更される。状態変更に対応するため、通知 NSApplicationDidChangeScreenParametersNotification を監視する。

CaptureController.m

[[NSNotificationCenter defaultCenter] addObserver:self
 selector:@selector(screenChanged:)
 name:NSApplicationDidChangeScreenParametersNotification
 object:nil];


- (void)screenChanged:(NSNotification *)notification
{
NSRect frame = [Screen frame];
[_window setFrame:frame display:NO];

frame.origin = NSZeroPoint;
[_view setFrame:frame];
}


これでスクリーン状態に変更があっても対応できる。


なお状況によっては範囲選択の線が表示できないケースもあり得る。こんな状況に対応する為に、位置とサイズをリセットするメニューを追加した。表示できないケースを自動的に検出することもできそうだがユーザに操作してもらう対応で十分だろう。


選択するとメッセージが表示され、位置とサイズが初期状態へ戻る。なおこの操作も範囲選択のアンドゥの対象になる。