2012-05-25 72 views
0

有關NSRect的問題...在Hillegass書中,我們創建了一個NSRect,在其中繪製一個橢圓(NSBezierPath *)。根據我們視圖中的位置,我們將鼠標向下拖動,然後拖動,NSRect的size.width和/或size.height可能是負值(即,如果我們從右上角開始,拖動左下角 - 均爲負值)。實際繪製時,系統是否使用我們的負寬度和/或高度來僅僅定位我們拖動的位置的NSPoint?因此更新NSRect?如果我們需要NSRect的大小,我們是否應該使用絕對值?更新NSRect大小爲負值

在本章中,作者使用MIN()和MAX()宏創建NSRect。然而,在測試溶液它們提供響應這三種方法鼠標事件:不管潛在負值

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil]; 
    // Why do we offset by 0.5? Because lines drawn exactly on the .0 will end up spread over two pixels. 
    workingOval = NSMakeRect(pointInView.x + 0.5, pointInView.y + 0.5, 0, 0); 
    [self setNeedsDisplay:YES]; 
} 

- (void)mouseDragged:(NSEvent *)theEvent 
{ 
    NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil]; 
    workingOval.size.width = pointInView.x - (workingOval.origin.x - 0.5); 
    workingOval.size.height = pointInView.y - (workingOval.origin.y - 0.5); 
    [self setNeedsDisplay:YES]; 
} 

- (void)mouseUp:(NSEvent *)theEvent 
{ 
    [[self document] addOvalWithRect:workingOval]; 
    workingOval = NSZeroRect; // zero rect indicates we are not presently drawing 
    [self setNeedsDisplay:YES]; 
} 

此代碼生成一個成功的矩形。我明白,負面價值觀僅僅反映了原點(我們「鼠標擊倒」)的轉變。在正確計算我們拖動的NSPoint的幕後發生了什麼?

回答

1

NSRect只是定義爲NSPoint和NSSize。 NSSize只是定義爲一對CGFloats,但文檔中提到:

通常,寬度和高度值均爲非負值。創建NSSize結構的函數不會阻止您爲這些屬性設置負值。但是,如果寬度或高度值爲負數,某些方法的行爲可能未定義。

在上面顯示的代碼中,幕後沒有任何幻想。您正在創建一個矩形(workingOval),該矩形恰好具有負值大小或寬度,並且實際上並未在任何地方使用。

根據你在其他地方使用workingOval所做的事情,幕後發生的事情將會有所不同。但這將是三件非常簡單的事情之一。有些方法將(原點=(30,40),尺寸=( - 10,-20))的矩形視爲與(原點=(20,20),尺寸=(10,20))相同;其他人則認爲它是無效的;有些人假設他們不測試,只是給你垃圾結果。例如,NSMinX將返回30,而不是10.