HMDT - Logic and Intuition -

about HMDT

Cocoa Programming Tips 1001

Application Kit

NSDragging

Application Kit - NSDragging

ドラッグを受け付ける

Keywords: registerForDraggedTypes, draggingEntered, draggingUpdated, draggingExited

ある View を、他からのドラッグを受け付けることができるようにするには、まず NSView の registerForDraggedTypes: を使うんだ。

Application Kit/NSView.h

- (void)registerForDraggedTypes:(NSArray*)pboardType;

引き数に、ドラッグで受け付けたいタイプを指定する。たとえば、Finder からファイルのドラッグをもらいたいときは、NSFilenamesPboardType を指定するんだ。タイプは NSPasteboard で解説している。

で、指定されたタイプがドラッグされると、メッセージが投げられる。これを受け取るには、NSDraggingDestination で指定されるメソッドをオーバーライドするんだ。

Application Kit/NSDragging.h

- (unsinged int)draggingEntered:(id <NSDraggingInfo>)sender;
- (unsinged int)draggingUpdated:(id <NSDraggingInfo>)sender;
- (void)draggingExited:(id <NSDraggingIno>)sender;

ドラッグが入ると、draggingEntered:、入ってるいる間は draggingUpdated: が呼び出される。draggingUpdated: は、一度だけじゃなくて、入っている間くり返し呼び出されるようだ。で、出たら draggingExited: が呼ばれる、と。

(sample)

- (id)initWithFrame:(NSRect)rect
{
    self = [super initWithFrame:rect];
    if(self) {
        NSArray* array = 
            [NSArray arrayWithObject:NSFilenamesPboardType];
        [self registerForDraggedTypes:array];
    }
    return self;
}

- (unsigned int)draggingEntered:(id <NSDraggingInfo>)sender
{
    printf("Drag entered¥n");
}

- (unsigned int)draggingUpdateed:(id <NSDraggingInfo>)sender
{
    printf("Drag updated¥n");
}

- (void)draggingExited:(id <NSDraggingInfo>)sender
{
    printf("Drag exited¥n");
}

上のサンプルでは、受け付けるドラッグのタイプとして、NSFilenamePboardType を指定しているんだ。これだと、たとえば Finder からのファイルドラッグを受け付けることができる。initWithFrame: の中で、registerForDraggedTypes: を呼ぶことで、指定してみた。

Application Kit - NSDragging

ドラッグされた View をハイライト表示する

Keywords: registerForDraggedTypes, draggingEntered, draggingUpdated, draggingExited

ある View に、Finder からファイルとかをドラッグしてきたとき、View の周りをハイライト表示させてみよう。

(sample)

- (id)initWithFrame:(NSRect)rect
{
    self = [super initWithFrame:rect];
    if(self) {
        NSArray* array = 
            [NSArray arrayWithObject:NSFilenamesPboardType];
        [self registerForDraggedTypes:array];
    }
    return self;
}

- (unsigned int)draggingEntered:(id <NSDraggingInfo>)sender
{
    [[NSColor selectedControlColor] set];
    NSFrameRectWidthWidth([self visibleRect], 2.0);
    [self displayIfNeeded];
    
    return NSDragOperationNone;
}

- (void)draggingExited:(id <NSDraggingInfo>)sender
{
    NSEraseRect([self visibleRect]);
    [self displayIfNeeded];
}

dragginEntered: と、draggingExited: を使ってる。

まず、draggingEntered: では、selectedControlColor を使って、強調色の設定をして、枠を描く。そのあと displayIfNeeded を呼んで、再描画しているんだ。

draggingExited では、NSEraseRect を使って、消している。ほんとは、枠だけ消せばいいんだけどね。

back to top content

Copyright © 2002-2006 HMDT. All rights reserved.