2013-02-21 90 views
3

我是編程,objective-c(和stackoverflow)的新手。我正在學習,並且進展緩慢;)但後來我遇到了一個谷歌無法解決的問題。我有一個窗口和一個NSview,然後添加了一個鼠標事件,該事件應該將座標繪製到我的視圖中,但事實並非如此。有趣的是:它是繪製當鼠標移過我的應用程序窗口的窗口按鈕...通過鼠標事件繪製成NSView

- (void)drawRect:(NSRect)dirtyRect { 
    NSPoint imagePos = NSMakePoint(0, 0); 
    NSImage *aImage = [NSImage imageNamed:@"mw_bg01.png"]; 
    [aImage dissolveToPoint:imagePos fraction:1.0]; 
} 
- (void)mouseDown:(NSEvent*)theEvent;{ 
    mouseLoc = [NSEvent mouseLocation]; 
    mousePosX = mouseLoc.x;mousePosY = mouseLoc.y; 
    NSString* mouseString = [NSString stringWithFormat:@"%d", mousePosX]; 
    NSPoint textPoint = NSMakePoint(5, 5); 
    NSMutableDictionary *textAttrib = [[NSMutableDictionary alloc] init]; 
    [textAttrib setObject:[NSFont fontWithName:@"Helvetica Light" size:10] 
       forKey:NSFontAttributeName]; 
    [textAttrib setObject:[NSColor grayColor] forKey:NSForegroundColorAttributeName]; 
    [mouseString drawAtPoint:textPoint withAttributes:textAttrib]; 
} 

我不知道怎麼去,有什麼建議?謝謝!

+0

此代碼是什麼?它看起來像你寫了一個mouseDown處理程序。取決於代碼的位置(例如,在應用程序中,或者在視圖中或其他方面),它可能僅僅是在哪裏它恰好是按鈕的委託而不是視圖。 – podperson 2013-02-21 22:18:59

+0

它在視圖中。我帶了一個mouseDown處理程序,因爲我想在我的視圖中測試繪圖,並且mousemove沒有被調用。 – fw2601 2013-02-21 22:25:34

+0

並且:我沒有任何按鈕,我的意思是3個OSX窗口按鈕... – fw2601 2013-02-21 22:37:59

回答

5

您不應該在-mouseDown:方法中進行繪圖。相反,您必須在-drawRect:(或您從-drawRect:撥打電話的方法)中完成所有繪圖。試試這樣的:

@interface MyView() 
    @property NSPoint lastMousePoint; 
@end 

@implementation MyView 

- (void)drawLastMousePoint 
{ 
    NSString *mouseString = NSStringFromPoint(self.lastMousePoint); 
    NSPoint textPoint = NSMakePoint(5, 5); 
    NSMutableDictionary *textAttrib = [[NSMutableDictionary alloc] init]; 
    [textAttrib setObject:[NSFont fontWithName:@"Helvetica Light" size:10] 
       forKey:NSFontAttributeName]; 
    [textAttrib setObject:[NSColor grayColor] forKey:NSForegroundColorAttributeName]; 
    [mouseString drawAtPoint:textPoint withAttributes:textAttrib]; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSPoint imagePos = NSMakePoint(0, 0); 
    NSImage *aImage = [NSImage imageNamed:@"mw_bg01.png"]; 
    [aImage dissolveToPoint:imagePos fraction:1.0]; 

    [self drawLastMousePoint]; 
} 

- (void)mouseDown:(NSEvent*)theEvent; 
{ 
    self.lastMousePoint = [theEvent locationInWindow]; 
    [self setNeedsDisplay:YES]; 
} 

@end 

當你得到一個鼠標按下事件,你只需將鼠標的位置存儲下來。圖紙在-drawLastMousePoint中完成,您可以在-drawRect:方法中調用。既然您知道只要點擊鼠標就需要重新繪製,您可以致電-setNeedsDisplay:通知視圖需要重繪。請注意,重繪不會立即發生,相反,它會在下一次通過運行循環時發生。換句話說,你的意思是說:「嘿,改變了一些事情,我需要再次畫出我的觀點內容,請儘快再次致電-drawRect:!」

另外一個注意事項:+[NSEvent mouseLocation]確實是設計用於獲取當前鼠標位置以外的事件流。通常,在-mouseDown:方法中,您調用-locationInWindow上的NSEvent作爲參數傳遞給方法。如果您需要轉換爲本地/視圖座標,則應調用[self convertPoint:[theEvent locationInWindow] fromView:nil];

+0

謝謝。我需要學習很多;) 但有一件事:當我打電話給setNeedsDisplay時,它也會繪製mw_bg01.png,對不對?這很慢,不是嗎? – fw2601 2013-02-21 22:47:56

+0

我們都是全新的在一個點:)。是的,它會再次繪製PNG。你不應該提前擔心這會很慢,而應該測試一下,看看它是否足夠慢,實際上有所作爲,然後才花時間改變它的工作方式。一般來說,在屏幕上繪製靜態PNG是相當快的。如果您確實需要提高性能,那麼有幾個選項,包括:僅重繪視圖的一部分(請參閱'-setNeedsDisplayInRect:'),在不同視圖中繪製鼠標點,該視圖是當前視圖的子視圖,使用CALayers等 – 2013-02-21 23:06:13

+0

@ fw2601難道這不適合你嗎?你爲什麼不接受答案? – 2013-02-22 18:33:32