2011年2月25日金曜日

Cocoa ObjC Viewだけでリサイズ(3)

今度は「デスクトップいっぱいの透明ウィンドウ」の中で作業してみる。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
 // Insert code here to initialize your application 
 NSScreen* main_screen = [NSScreen mainScreen];
 NSRect fullscreen_frame = [main_screen frame];
 [window setFrame:fullscreen_frame display:YES];
 [window setStyleMask:NSResizableWindowMask];
 [window setOpaque:NO];
 [window setBackgroundColor:[NSColor clearColor]];
 [window makeKeyAndOrderFront:self];
 NSRect rect=NSMakeRect(100, 100, 640, 480);
 MovableView *view=[[MovableView alloc] initWithFrame:rect];
 [[window contentView] addSubview:view];
}

今回はMovableViewというNSViewのサブクラスを動的に生成してみた。

このViewをマウスのドラッグで動かしたり、リサイズしたりする実験。

本日はドラッグでViewだけ動かしておしまい。
簡単に考えると、マウスのドラッグの移動量を現在のFrameのrectに足して、改めて[self setFrame:rect]とかやればいいような気がするわけだが、これがなぜかうまくいかない。rectのoriginが想定よりも倍くらい増えるんだなあ。なぜだろう。

マウスドラッグを追いかける方法はデベロッパドキュメントには3通り載っていて、xcatsan師匠はmouseDownでloopを回す方法をとっているけれど、今回は最初の例、mouseDownでドラッグ中のflagを立て、mouseDraggedで実際の処理をしてみた。

-(void)mouseDown:(NSEvent *)event{
 NSLog(@"mouseDown");
 NSPoint p = [self convertPoint:[event locationInWindow] fromView:nil];
 if (NSPointInRect(p,[self frame])){
  windowDrag=YES;
        }
}
-(void)mouseDragged:(NSEvent *)theEvent{
 NSLog(@"drag!!");
 if(windowDrag){
  NSRect rect=[self frame];
  [self translateOriginToPoint:NSMakePoint(theEvent.deltaX, -theEvent.deltaY)];
  [self setFrameSize:NSMakeSize(rect.size.width+theEvent.deltaX, rect.size.height-theEvent.deltaY)];
  [self setNeedsDisplay:YES];
    NSLog(@"df:%f dy %f",theEvent.deltaX,theEvent.deltaY);
 
 }  
}
とりあえず以上で、View内でマウスをクリック→ドラッグしたらViewが動く、という処理が実現できている。[self translateOriginToPoint:NSMakePoint(theEvent.deltaX, -theEvent.deltaY)];としないと、なぜoriginが想定したように動かないのかまだ理解出来ていない。結果オーライなコードなので自分でもかなり信用度が低い。(^^;)

明日は休みなのでもう少し実験できるかな。
しかし在宅仕事の必要があるのでどの程度時間を割けるか・・・。

0 件のコメント:

コメントを投稿