2015-05-10 58 views
3

我有一個NSWindow,它帶有類似於提醒中的分隔屏幕。所以我用這個代碼:使NSWindow具有透明標題欄部分不可移動

self.window.titlebarAppearsTransparent = true 
self.window.styleMask |= NSFullSizeContentViewWindowMask 

這個很完美。但在窗口內部,我有一個SplitView(如提醒應用程序)和NSOutlineView在右側。 OutlineView上升到窗口角落的頂部。

現在的問題是:在OutlineView的頂部單擊並拖動可使窗口移動。任何方式,我可以禁用此功能,但仍然保持應用程序左側的移動能力?

+0

窗口拖動是一個函數窗口服務器。祝你好運。 – CodaFi

回答

1

好,有你需要做兩件事情:

首先,你需要設置你的窗口是不可移動的。爲此,子類化窗口並覆蓋​​並返回no。或者您撥打setMovable:並將其設置爲no。

之後,您必須通過添加具有您想要拖動的區域的確切大小和位置的視圖來手動重新啓用拖動。或者,您可以設置一個NSTrackingArea。無論哪種方式,您都需要覆蓋mouseDown:並插入一些代碼來移動窗口。

我在碼字:

Objective-C的

[self.window setMovable:false]; 

// OR (in NSWindow subclass) 

- (BOOL)isMovable { 
    return false; 
} 

//Mouse Down 
- (void)mouseDown:(NSEvent *)theEvent { 
    _initialLocation = [theEvent locationInWindow]; 

    NSPoint point; 
    while (1) { 
     theEvent = [[self window] nextEventMatchingMask: (NSLeftMouseDraggedMask | NSLeftMouseUpMask)]; 
     point =[theEvent locationInWindow]; 

     NSRect screenVisibleFrame = [[NSScreen mainScreen] visibleFrame]; 
     NSRect windowFrame = [self.window frame]; 
     NSPoint newOrigin = windowFrame.origin; 

     // Get the mouse location in window coordinates. 
     NSPoint currentLocation = point; 
     // Update the origin with the difference between the new mouse location and the old mouse location. 
     newOrigin.x += (currentLocation.x - _initialLocation.x); 
     newOrigin.y += (currentLocation.y - _initialLocation.y); 

     // Don't let window get dragged up under the menu bar 
     if ((newOrigin.y + windowFrame.size.height) > (screenVisibleFrame.origin.y + screenVisibleFrame.size.height)) { 
      newOrigin.y = screenVisibleFrame.origin.y + (screenVisibleFrame.size.height - windowFrame.size.height); 
    } 

    // Move the window to the new location 
    [self.window setFrameOrigin:newOrigin]; 
    if ([theEvent type] == NSLeftMouseUp) 
     break; 
    } 
} 

initialLocationNSPoint財產

注:我查閱了一些東西herehere