我有一个控件,其中包含使用GDI +绘制的形状,用户可以放大它。如果他放大远处绘制形状的实际坐标变得非常大。
现在我放大了FillEllipse
绘制的圆圈左边缘的位置,过了一会儿,圆圈突然翻转,我实际上看到的是右边缘而不是左边缘。
我提取了坐标并提出了一个简单的程序来重现问题(所需的一切都是一个表格,上面有两个单选按钮和一个足够大小的图片框):
Public Class Form1
Private Sub Draw()
'Create a canvas
Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Using g As Graphics = Graphics.FromImage(bmp)
g.Clear(Color.Black)
'X location, Y location and the diameter of the circle to draw
Dim x, y, dia As Single
If RadioButton1.Checked Then
'This works as expected
x = 561
y = -3993174.7
dia = 7986931.0
Else
'This comes out flipped
x = 561
y = -4436903.7
dia = 8874368.0
End If
'Define and draw the ellipse
Dim rectf As New RectangleF(x, y, dia, dia)
g.FillEllipse(Brushes.Red, rectf)
g.DrawEllipse(Pens.LightGreen, rectf)
'Mark the circle's vertical center
g.DrawLine(Pens.Blue, 0.0F, y + dia / 2, CSng(bmp.Width), y + dia / 2)
End Using
'Display the image
If PictureBox1.Image IsNot Nothing Then PictureBox1.Image.Dispose()
PictureBox1.Image = bmp
End Sub
Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
'Redraw on radiobutton check change
Draw()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Draw()
End Sub
End Class
在下面的图片中,红色部分是正在绘制的椭圆,黑色是背景,蓝色行是椭圆的垂直中心,根据我输入的坐标计算得出。
如果您运行该程序并选择RadioButton1
,您将看到以下内容:
一切都很好,圆圈被向右拉。
但是,如果您选择RadioButton2
,则会看到:
圆圈突然水平翻转,向左拉。
我怀疑某种程度上存在大的价值干扰但我老实说无法看出这种结果如何产生的原因。 有人可以解释为什么GDI +会感到不安以及如何解决它?
非常感谢VB.NET和C#中的两个答案。