这是我在这里的第一个问题。 我正在尝试在VB.NET中构建一个拨号控件作为自定义用户控件。我正在使用VS2008。
到目前为止,我已设法使用graphics.rotatetransform旋转图像。然而,这会旋转一切。现在我有一个表盘的位图,它应该保持稳定,另一个针对我需要旋转的针位图。
到目前为止,我已经尝试过这个:Dim gL As Graphics = Graphics.FromImage(bmpLongNeedle)
gL.TranslateTransform(bmpLongNeedle.Width / 2, bmpLongNeedle.Height * 0.74)
gL.RotateTransform(angleLongNeedle)
gL.TranslateTransform(-bmpLongNeedle.Width / 2, -bmpLongNeedle.Height * 0.74)
gL.DrawImage(bmpLongNeedle, 0, 0)
根据我的理解,针的图像应该以角度“angleLongNeedle”旋转,尽管我将旋转的图像放在0,0。但是,结果是Needle不会被控件绘制。
关于我可能出错的地方或我应该做的其他事情的任何指示?
提前致谢
答案 0 :(得分:0)
首先,为什么要从位图中分配Graphics
对象然后继续绘制到图形上?这没有意义。
Dim gL As Graphics = Graphics.FromImage(bmpLongNeedle)
' … '
gL.DrawImage(bmpLongNeedle, 0, 0)
您可能想要的是整个图像的图形上下文。然后,您将转换应用于它,最后绘制bmpLongNeedle
图像。
其次,您的翻译看起来是反转的:在第一步中,您需要将图像移动到原点(0,0);然后你旋转它,然后将其移回。所以转型应该是这样的:
gL.TranslateTransform(-bmpLongNeedle.Width * 0.5, -bmpLongNeedle.Height * 0.5)
gL.RotateTransform(angleLongNeedle)
gL.TranslateTransform(bmpLongNeedle.Width * 0.5, bmpLongNeedle.Height * 0.5)
请注意TranslateTransform
s的反转顺序。另外,你为什么翻译高度的0.74倍而不是一半?
答案 1 :(得分:0)
哦,针的位图的枢轴点为0.74 *高度。
可能是我之前应该发布的。但这就是我所做的。
Public Class Altimeter
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim bmpBezel As New Bitmap("{path}\Altimeter_Background.bmp")
Dim bmpLongNeedle As New Bitmap("{path}\LongNeedle.bmp")
Dim rect2 As New Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.Width, e.ClipRectangle.Height)
'make transparent
bmpBezel.MakeTransparent(Color.Yellow)
bmpLongNeedle.MakeTransparent(Color.Yellow)
Dim angleLongNeedle As Single = (Altitude / 50) * 360
'draw bezel
e.Graphics.DrawImage(bmpBezel, rect2)
'rotate long needle
Dim gL As Graphics = Graphics.FromImage(bmpLongNeedle)
gL.TranslateTransform(bmpLongNeedle.Width / 2, bmpLongNeedle.Height * 0.74)
gL.RotateTransform(angleLongNeedle)
gL.TranslateTransform(-bmpLongNeedle.Width / 2, -bmpLongNeedle.Height * 0.74)
gL.DrawImage(bmpLongNeedle, 0, 0)
MyBase.OnPaint(e)
End Sub
我使用e.graphics.drawimage绘制整个图像。我真的不明白你所说的有关所有图像的图形对象,然后画针的内容?你有伪代码吗? 感谢