まずスクリーンの状態を管理するクラス 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];
}
これでスクリーン状態に変更があっても対応できる。
なお状況によっては範囲選択の線が表示できないケースもあり得る。こんな状況に対応する為に、位置とサイズをリセットするメニューを追加した。表示できないケースを自動的に検出することもできそうだがユーザに操作してもらう対応で十分だろう。
選択するとメッセージが表示され、位置とサイズが初期状態へ戻る。なおこの操作も範囲選択のアンドゥの対象になる。