如何旋转窗体中的所有图形而不会导致MouseArgs出现乱码

时间:2017-03-07 16:04:26

标签: c# winforms graphics

最近我发现了如何旋转图像,我已经有问题了。 以下是我遇到问题的一段代码,但您可能不需要查看它...

Graphics g = e.Graphics;
g.TranslateTransform((float)Width / 2, (float)Height / 2);
g.RotateTransform(myAngle);

Brush brush = new SolidBrush(Color.FromArgb(32, 1, 1, 1));
Pen pen = new Pen(Color.FromArgb(255, 128 , 128, 128), 3);

g.FillRectangle(brush, nX, nY, snX - nX, snY - nY);
g.DrawRectangle(pen, nX, nY, snX - nX, snY - nY);

变量X,sX,snX,Y,sY,snY是特定时刻鼠标的坐标,主要在Form1_MouseMove中计算,我无法显示其中的内容。

无论myAngle是什么,我怎样才能使这些变量也发生变化?

1 个答案:

答案 0 :(得分:0)

我做了一个例子,如何在旋转的位图上绘图:(使用图片框/位图/轨迹栏)

public partial class Form1 : Form
{
    private Bitmap _bitmap;

    public Form1()
    {
        InitializeComponent();

        _bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    }

    private void TransformGraphics(Graphics g)
    {
        g.ResetTransform();
        g.TranslateTransform(_bitmap.Width / 2, _bitmap.Height / 2);
        g.RotateTransform(trackBar1.Value);
        g.TranslateTransform(-_bitmap.Width / 2, -_bitmap.Height / 2);
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        TransformGraphics(e.Graphics);
        e.Graphics.DrawImage(_bitmap, new Point());
    }

    private Point? _previousPoint;

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        _previousPoint = e.Location;
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        _previousPoint = null;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (_previousPoint.HasValue)
        {
            using (Graphics g = Graphics.FromImage(_bitmap))
            {
                TransformGraphics(g);
                var matrix = g.Transform;
                matrix.Invert();


                var points = new[] { _previousPoint.Value, e.Location };

                matrix.TransformPoints(points);

                g.ResetTransform();
                g.DrawLine(Pens.Black, points[0], points[1]);
                pictureBox1.Invalidate();

                _previousPoint = e.Location;
            }
        }
    }

    private void trackBar1_ValueChanged(object sender, EventArgs e)
    {
        pictureBox1.Invalidate();
    }
}

RotatedDraw

您可以添加另一个跟踪栏以进行缩放。