2012-09-23 61 views
2

我做了一個名爲Uberlayer的應用程序。用戶可以使用這個單用途的Mac應用程序在其他應用程序之上疊加圖像。拖動一個NSWindow高於菜單欄

我使用setMovableByWindowBackground來啓用拖動整個窗口的背景。

我想做一點改進,因爲應用程序現在不能拖動窗口高於菜單欄,這可能有點惱人。在正常的窗口中,我可以想象將它鎖定到Menubar是一件好事,但對於這種用例,將其拖到更高位置會是一件好事。

任何人都知道如何改變這個默認的窗口行爲?

回答

3

而不是使用-setMovableByWindowBackground:覆蓋-mouseDown:事件是這樣的:

- (void)mouseDown:(NSEvent *)event 
{ 
    NSPoint originalMouseLocation = [window convertBaseToScreen:[event locationInWindow]]; 
    NSRect originalFrame = [window frame]; 

    while (YES) 
    { 
     NSEvent *newEvent = [window nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)]; 

     if ([newEvent type] == NSLeftMouseUp) 
     { 
      break; 
     } 

     NSPoint newMouseLocation = [window convertBaseToScreen:[newEvent locationInWindow]]; 
     NSPoint delta = NSMakePoint(
            newMouseLocation.x - originalMouseLocation.x, 
            newMouseLocation.y - originalMouseLocation.y); 

     NSRect newFrame = originalFrame; 

     newFrame.origin.x += delta.x; 
     newFrame.origin.y += delta.y; 

     [window setFrame:newFrame display:YES animate:NO]; 
    } 
} 

**不要忘了隱藏窗口的標題欄(選擇窗口 - >去屬性督察 - >取消標題欄 ),因爲它的窗戶不能比菜單欄高。或者其他解決方案是創建無邊框窗口。

+0

+1爲鼠標下降:方法:) – epologee

+0

謝謝!完美的作品.. – Jankeesvw

+0

@Jankeesvw不客氣,我很高興幫助。 –

0

我只是增加了賈斯汀的答案。您需要在使用Justin的-mouseDown:代碼時設置其級別。

[window setLevel:NSMainMenuWindowLevel]; 

如果窗口的水平低於NSMainMenuWindowLevel它將無法工作。 如果您希望窗口位於狀態欄上方,您可以將其設置爲NSStatusWindowLevel