2012-04-28 28 views
0

如何在按鈕點擊後在特定窗口中繪製一條線?在可可畫線?

我使用這個:

NSBezierPath * path = [NSBezierPath bezierPath]; 
     [path setLineWidth: 4]; 

     NSPoint startPoint = { 21, 21 }; 
     NSPoint endPoint = { 128,128 }; 
     [path moveToPoint: startPoint];  
     [path lineToPoint:endPoint]; 

     [[NSColor redColor] set]; 
     [path stroke]; 

,但只有當我把它在它的工作:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 

我怎麼能解決這個問題? 我的目標是創建一個可以畫線的應用程序,根據收到的細節(座標)

謝謝。

+0

你想在哪裏繪製它們(在哪個視圖中)?我認爲你必須子類化NSView,並把你的繪圖代碼放在那裏。我不知道爲什麼它沒有子類化時,你把它放在applicationWillFinishLaunching方法。 – rdelmar 2012-04-28 00:29:36

+0

好的,我在繪製NSview類,並在自定義視圖內 – Corninos 2012-04-28 09:28:32

回答

0

您是否在完成繪圖時嘗試調用[yourView setNeedsDisplay:YES]?

2

您不應該在視圖或圖層的繪圖方法之外進行繪製(例如,drawRect:)。你想做的事情,廣泛的筆觸,有一個視圖,當設置標誌畫線時,當你點擊按鈕,設置標誌,並告訴視圖重畫。

0

當你點擊鼠標事件。此代碼將創建線條,曲線和繪圖。

#import <Cocoa/Cocoa.h> 


    @interface BezierView : NSView { 
     NSPoint points[4]; 
     NSUInteger pointCount; 
    } 

    @end 

    #import "BezierView.h" 

    @implementation BezierView 
    - (id)initWithFrame:(NSRect)frame { 
     self = [super initWithFrame:frame]; 
     if (self) { 
      // Initialization code here. 
     } 
     return self; 
    } 

    - (void)drawRect:(NSRect)rect 
    { 
     NSBezierPath *control1 = [NSBezierPath bezierPath]; 
     [control1 moveToPoint: points[0]]; 
     [control1 lineToPoint: points[1]]; 
     [[NSColor redColor] setStroke]; 
     [control1 setLineWidth: 2]; 
     [control1 stroke]; 

     NSBezierPath *control2 = [NSBezierPath bezierPath]; 
     [control2 moveToPoint: points[2]]; 
     [control2 lineToPoint: points[3]]; 
     [[NSColor greenColor] setStroke]; 
     [control2 setLineWidth: 2]; 
     [control2 stroke]; 

     NSBezierPath *curve = [NSBezierPath bezierPath]; 
     [curve moveToPoint: points[0]]; 
     [curve curveToPoint: points[3] 
       controlPoint1: points[1] 
       controlPoint2: points[2]]; 

     [[NSColor blackColor] setStroke]; 
     CGFloat pattern[] = {4, 2, 1, 2}; 
     [curve setLineDash: pattern 
        count: 4 
        phase: 1]; 
     [[NSColor grayColor] setFill]; 
     [curve fill]; 
     [curve stroke]; 
    } 

    - (void)mouseDown: (NSEvent*)theEvent 
    { 
     NSPoint click = [self convertPoint: [theEvent locationInWindow] 
            fromView: nil]; 
     points[pointCount++ % 4] = click; 
     if (pointCount % 4 == 0) 
     { 
      [self setNeedsDisplay: YES]; 
     } 
    } 
    @end