【发布时间】:2020-03-28 10:45:11
【问题描述】:
我正在尝试做一些我认为非常简单的事情:围绕其中心旋转一个椭圆。所以我设置了一个简单的程序来尝试这样做。最后,我需要做的是单击椭圆的一部分,然后将鼠标移动到会导致椭圆旋转的方向。但是,目前,我要做的就是右键单击一个表单,在鼠标单击的中心出现一个椭圆形,然后接下来绘制旋转的椭圆形。它有点工作。我之所以这么说是因为我第一次单击时,椭圆形及其旋转的椭圆形恰好出现在正确的位置,两个椭圆形的中心就在我的鼠标指针所在的位置。但是,如果我再次单击表单上的其他位置,椭圆会按预期运行(正常和旋转的椭圆出现,彼此居中),但椭圆出现在表单上完全随机的位置(意味着不在ex和ey co-ords)
以下是代码的相关部分:
//this is declared at the top of the form
float theAngle = 0;
Matrix result = new Matrix();
Point center = new Point(0,0);
//this is declared in the form constructor
ovalGraphic = this.CreateGraphics();
//This is declared in the event handler for the mouseclick
if (e.Button == MouseButtons.Right)
{
ovalGraphic.DrawEllipse(pen2, e.X-50, e.Y-15, 100, 30);
xUp_lbl.Text = e.X.ToString();
yUp_lbl.Text = e.Y.ToString();
center.X = e.X;
center.Y = e.Y;
result.RotateAt(theAngle+=10, center);
ovalGraphic.Transform = result;
ovalGraphic.DrawEllipse(pen3, e.X - 50, e.Y - 15, 100, 30);
}
在我第一次单击表单并移动鼠标后,任何人都可以看到椭圆出现在随机位置的任何原因吗?
【问题讨论】:
-
您犯的大错误是试图在
Click处理程序中绘图。那是行不通的。仅在Paint处理程序中绘制。this.CreateGraphics()仅对测量屏幕分辨率等有用;它不会绘制到屏幕或持续存在。您应该只在 Click 处理程序中使用Invalidate。 -
另外,将矩阵也移动到
Paint事件中。另外,您需要处理 Matrix 对象。目前尚不清楚如何计算旋转角度。添加10不符合您的要求。 -
嗯,这实际上只是原型代码,它必须进入其他代码,这是......真正的混乱。但是,我不太擅长使用 Windows 图形,所以我还有一些额外的问题:1)我将使用 Invalidate 做什么? 2)我没有 Paint 事件,所以没有“处理程序”。而且不会有,因为我插入的代码没有 Paint 事件处理程序。
-
在 MouseDown 或 MouseUp 事件中调用
Invalidate()。由于您有这些事件的处理程序,您还可以向 Paint 事件添加一个处理程序,它将提供您需要的e.Graphics对象 (PaintEventArgs e)。 -
@Cynon:随机位置不是随机的。由于您缓存了图形对象,因此它是多次应用旋转变换的结果。您没有清除第一个转换,因此第二个转换与第一个“堆叠”。