在点击位置绘制新的圆形位图,同时保留先前绘制的圆圈

时间:2016-06-14 18:43:00

标签: c# bitmap system.drawing

我正在尝试使用Bitmap绘制圆圈。

每次单击鼠标时,我之前绘制的圆圈都会移动到新位置。

我想要发生的是:每次单击鼠标时,都会在我单击的位置创建/绘制一个新圆圈,并且所有先前绘制的圆圈都保持不动。

我正在使用以下代码:

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet AnimatableView *animableView;
@end

@implementation ViewController

- (void)animateAlongPath
{
    UIBezierPath * path = [UIBezierPath bezierPathWithRect:self.view.frame];

    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    animation.duration = 10;
    animation.path = path.CGPath;
    animation.removedOnCompletion = NO;
    animation.fillMode = @"kCAFillModeForwards";
    [self.animableView.layer addAnimation:animation forKey:@"animation"];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)animate:(id)sender {
    [self animateAlongPath];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView: [touch view]];

    CALayer * selectedlayer = (CALayer*)[self.animableView.layer.presentationLayer hitTest:location];
    if(selectedlayer != nil)
        NSLog(@"touched");
    else
        NSLog(@"dont touched");
}


@end

4 个答案:

答案 0 :(得分:2)

你的英语有点令人困惑。如果我正确地理解你的问题,那么现在唯一被绘制的就是点击所在的新圈子,你想要所有旧的圈子也一直存在?在这种情况下,有两种选择:

  1. 在绘制之前不要清除位图。 rectangleObj将清除您刚绘制的位图。如果删除该行并且不清除位图,则下次单击时,它将在最后一个位图的顶部绘制新的椭圆。
  2. 如果您希望每次都有新的绘图/位图,则需要一个rectangleObj列表。每次单击时,都会将该点添加到T.get('application/rate_limit_status', { resources: 'statuses' }, showRTLimit); function showRTLimit(err, data, response){ var showRTLim = data.resources.statuses['/statuses/show/739695095222390785'].remaining; console.log(showRTLim); } 集合中。然后在你的draw方法中,你将迭代整个集合并绘制所有这些。

答案 1 :(得分:1)

我注意到了一些事情。首先,在Form1_MouseDown()中,你有这个:

clickCurrent = PointToClient(Cursor.Position);
clickPrev = clickCurrent;

在您保存之前,您将覆盖旧位置(clickPrev)。如果你想保留两个位置,你应该把它们放在一个简单的结构中,比如List。获得新点后,只需将Add()添加到列表中即可。然后,在Draw()例程中,遍历列表中的所有元素并将它们全部绘制出来。

如果你只想要两个职位 - 只有两个职位 - 只需交换你的陈述:

clickPrev = clickCurrent;
clickCurrent = PointToClient(Cursor.Position);

你必须为绘图分配另一个矩形对象,尽管在Draw()例程中处理这个更有意义。

答案 2 :(得分:1)

交换以下陈述的位置

var upload_file = function (file, response) {

    var formData = new FormData();

    formData.append('image', file);

    return $http({
        method: 'PUT',
        url: response.signed_request,
        data: formData,
        headers: {
            'Content-Type': file.type
        },
        cache: true
    });
};

我认为您在初始化clickCurrent = PointToClient(Cursor.Position); clickPrev = clickCurrent; 后将clickCurrent分配给clickPrevious。它需要是另一种方式。

答案 3 :(得分:1)

请试试这个

Rectangle rectangleObj;
Bitmap background;
Graphics scG;
Pen myPen;

private void Form1_Load(object sender, EventArgs e)
{
    rectangleObj = new Rectangle(10, 10, 30, 30);
    background = new Bitmap(Width, Height);
    scG = Graphics.FromImage(background);
    myPen = new Pen(Color.Red, 3);

    BackgroundImage = background;
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    var point = PointToClient(Cursor.Position);

    rectangleObj.X = point.X - rectangleObj.Height / 2;
    rectangleObj.Y = point.Y - rectangleObj.Width / 2;

    scG.DrawEllipse(myPen, rectangleObj);
    Refresh();
}
已删除

OnPaintDraw个方法。以及clickCurrentclickPrev字段。

当您更改表单大小(例如,最大化它)时,位图和图形保持不变,因此您可以获得此效果。为避免这种情况,您需要添加事件处理程序

private void Form1_SizeChanged(object sender, EventArgs e)
{
    background = new Bitmap(Width, Height);
    scG = Graphics.FromImage(background);
    BackgroundImage = background;
}

请注意,每次调整表单大小时,以前绘制的所有内容都将被删除。如果这是不合需要的,则需要采用不同的方法进行绘图。让我知道,我将再举一个例子。