Geometry 関数
NSBundle
NSDictionary
NSFileManager
NSMutableAttributedString
NSNumber
NSScanner
NSString
NSTimer
Graphic 関数
NSApplication
NSBezierPath
NSCell
NSColor
NSCursor
NSCustomImageRep
NSDocument
NSDocumentController
NSDragging
-ドラッグを受け付ける
-ドラッグされた View をハイライト表示する
NSEvent
NSFontManager
NSGraphicsContext
NSImage
NSMenu
NSOutlineView
NSPanel
NSPopUpButton
NSResponder
NSScrollView
NSString 追加
NSTableColumn
NSTableView
NSTextStorage
NSTextView
NSToolbar
NSView
NSWindow
NSWorkspace
その他
.nib ウィンドウ
Views パレット
クラス
インスタンス変数
メソッド
CFXML
Carbon Event
Carbon Graphics
Cocoa で日本語
メソッド
その他

- 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 を使って、消している。ほんとは、枠だけ消せばいいんだけどね。



[Home] [Download] [Archives] [BBS] [Cocoa Programming Tips 1001] [Core Foundation の秘密] [Safari Developer Center] [はじめてのブラウザのつくり方] [Sketch BP] [スクリーンセイバーを作ろう] [Objective-C 最適化] [Authorization API 完全理解] [Mac OS X Programming Books Review] [オブジェクト指向の言語比較論] [panther-dev]

mailto: mkino@xd5.so-net.ne.jp