2010-05-31 2 views
1

это мой первый вопрос здесь. Я пытаюсь создать элемент управления набором в качестве пользовательского элемента управления в VB.NET. Я использую VS2008.VB.NET пользовательский контроль управления графикой вращения

До сих пор мне удалось повернуть изображение, используя 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. Однако результат заключается в том, что иглу не нарисовать на элементе управления.

любые указатели относительно того, где я могу пойти не так или что-то еще, что я должен делать?

Заранее спасибо

ответ

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 с. Кроме того, почему вы перевели на 0,74 раза больше высоты, а не наполовину?

0

oh растровое изображение для иглы имеет точку поворота на высоте 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 для рисования всего изображения. я действительно не понимаю, что вы сказали о том, что графический объект для всех изображений, а затем рисует иглу? у вас есть псевдо-код? спасибо