VB.NET пользовательский элемент управления поворотом графики - PullRequest
1 голос
/ 31 мая 2010

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

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

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

Ответы [ 2 ]

0 голосов
/ 31 мая 2010

ой растровое изображение для иглы имеет точку поворота на высоте 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)</p>

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

0 голосов
/ 31 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...