3

私はプログラミング、objective-c(およびstackoverflow)が初めてです。私は非常にゆっくりと学習し、前進しています;)しかし、Googleが解決できない問題に遭遇しました。単一のウィンドウと 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];
}

どうすればいいのかわからない、何か提案はありますか?ありがとう!

4

1 に答える 1

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:できるだけ早くもう一度呼び出してください!」と言っているのです。

もう 1 つの注意点:は、イベント ストリームの外で+[NSEvent mouseLocation]現在のマウスの位置を取得するように設計されています。通常、メソッドでは、メソッドに引数として渡されたを呼び出します。ローカル/ビュー座標に変換する必要がある場合は、 を呼び出す必要があります。-mouseDown:-locationInWindowNSEvent[self convertPoint:[theEvent locationInWindow] fromView:nil];

于 2013-02-21T22:37:39.563 に答える