ページ

2009年2月22日日曜日

ドラッグ&ドロップ(6)ウィンドウの移動

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

以前ウィンドウの移動を抑止したが、画像以外の余白部分のドラッグであればウィンドウ移動にしたい。NSView#mouseDownCanMoveWindowが使えそうに見えたがどうもうまくいかず、結局余白部分のヒットテスト&自前ウィンドウ移動で対応した。

(参考)Cocoabuilder - Re: Conditional mouseDownCanMoveWindow for NSView?


擬似コードはこんな感じ。

- (void)mouseDown:(NSEvent *)theEvent
{
if (画像ヒットテスト) {
 // ドラッグ処理

} else {
// ウィンドウ移動処理
NSWindow *window = [self window];
NSPoint origin = [window frame].origin;
NSPoint old_p = [window convertBaseToScreen:[theEvent locationInWindow]];
while ((theEvent = [window nextEventMatchingMask:NSLeftMouseDraggedMask|NSLeftMouseUpMask]) && ([theEvent type] != NSLeftMouseUp)) {
NSPoint new_p = [window convertBaseToScreen:[theEvent locationInWindow]];
origin.x += new_p.x - old_p.x;
origin.y += new_p.y - old_p.y;
[window setFrameOrigin:origin];
old_p = new_p;
}
}
}



例えば下の図の場合、中心の画像上でマウスを押せば画像のドラッグ&ドロップになり、その周りの黒い余白をドラッグすればウィンドウの移動となる。