Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
aleksandr_l
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 32
1

Вращение изображения

29.03.2017, 08:18. Просмотров 970. Ответов 3
Метки нет (Все метки)

Всем привет.
Пишу приложение которое должно отображать обороты двигателя, но никак не могу нормально заставить стрелку вращаться.
Стрелка вращается, но не появляется в момент загрузки программы и оставляет за собой след.

C#
1
2
3
4
5
6
7
8
9
10
11
12
        Image image;
        Graphics g;
.......
        image = Image.FromFile("C:\\arrow.png");
        SpeedArrow.Parent = this;
        SpeedArrow.Bounds = new Rectangle(32, 119, 312, 312);
        g = this.SpeedArrow.CreateGraphics();
        g.TranslateTransform(156, 156);
        g.RotateTransform(i);
        g.DrawImage(image, -23, -156);
        g.RotateTransform(-i);
        g.TranslateTransform(0, -156);
0
Миниатюры
Вращение изображения  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2017, 08:18
Ответы с готовыми решениями:

Как добиться качественного рисования изображения поверх изображения picturebox?
есть код: PictureBox p = (PictureBox)sender; ...

Визуальное перелистывание изображения при переходе от одного изображения к другому
Здравствуйте,нужна помощь,как можно в C#,windows form создать приложение...

Вращение изображения
Нашел на форуме несколько тем, которые не дали ответа на мой вопрос. А вопрос...

Вращение модели 3d
Как можно сделать выбор вращения с помощью кнопок, ползунков и масштабируемость...

Вращение многоугольника
Приветствую форумчане. Подскажите пожалуйста как отрисовать 3-х мерный...

3
Sanya_sa
Модератор
708 / 692 / 301
Регистрация: 03.02.2015
Сообщений: 4,420
Записей в блоге: 8
Завершенные тесты: 3
29.03.2017, 09:27 2
Построить правильный пятиугольник вписанный в окружность
Поворот изображения на произвольный градус
0
ViterAlex
6677 / 3696 / 1513
Регистрация: 11.02.2013
Сообщений: 8,130
Завершенные тесты: 3
29.03.2017, 22:35 3
Лучший ответ Сообщение было отмечено Storm23 как решение

Решение

aleksandr_l, такие вещи делаются отдельными контролами. Потому что к рисованию формы это не имеет никакого отношения. Где-то был пример такого контрола, сделанный Storm23, но я так сходу не нашёл его. Посему предлагаю свою поделку.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
public partial class Speedometer : UserControl
{
    public Speedometer()
    {
        InitializeComponent();
        SetStyle(ControlStyles.DoubleBuffer |
            ControlStyles.OptimizedDoubleBuffer |
            ControlStyles.UserPaint |
            ControlStyles.AllPaintingInWmPaint |
            ControlStyles.SupportsTransparentBackColor |
            ControlStyles.ResizeRedraw, true);
    }
 
    private const int MINANGLE = 150;//Угол поворота при 0
    private const int MAXANGLE = 390;//Угол поворота при максимальном значении
 
    private Image _arrow;
 
    public Image Arrow
    {
        get
        {
            return _arrow ?? Properties.Resources.arrow;
        }
        set
        {
            _arrow = value;
        }
    }
 
    private float Diameter
    {
        get
        {
            return Math.Min(Width, Height) * 0.8f;
        }
    }
 
 
    private float _speed;
 
    public float Speed
    {
        get
        {
            return _speed;
        }
        set
        {
            //Отрицательные значения скорости
            if (value < 0)
            {
                _speed = 0;
                Invalidate();
                return;
            }
            //Слишком большие значения скорости
            if (value > MaxSpeed)
            {
                _speed = MaxSpeed;
                Invalidate();
                return;
            }
            _speed = value;
            Invalidate();
        }
    }
 
    private float _maxSpeed = 200f;
 
    public float MaxSpeed
    {
        get
        {
            return _maxSpeed;
        }
        set
        {
            _maxSpeed = value;
            Invalidate();
        }
    }
 
    #region Overrides of Control
 
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        //Верхний левый угол прямоугольника для циферблата
        var pt = ClientRectangle.Location;
        pt.Offset((int)((Width - Diameter) / 2), (int)((Height - Diameter) / 2));
        //Размер прямоугольника
        var rect = new RectangleF(pt.X, pt.Y, Diameter, Diameter);
        using (var path = new GraphicsPath())
        {
            path.AddEllipse(rect);
            using (var brush = new PathGradientBrush(path))
            {
                brush.CenterPoint = new PointF(Width / 2f, Height / 2f);
                brush.CenterColor = Color.LightBlue;
                brush.SurroundColors = new[] { Color.Black, };
                brush.FocusScales = new PointF(0,0);
                e.Graphics.FillEllipse(brush, rect);
            }
        }
        using (var pen = new Pen(Color.Yellow, 3) { Alignment = PenAlignment.Inset })
        {
            e.Graphics.DrawEllipse(pen, rect);
        }
        e.Graphics.TranslateTransform(ClientSize.Width / 2f, ClientSize.Height / 2f);
        //Угол поворота стрелки
        float angle = (MAXANGLE - MINANGLE) * Speed / MaxSpeed + MINANGLE;
        e.Graphics.RotateTransform(angle);
        //Размеры картинки 
        int h = (int)(Diameter * 0.1f);
        int w = (int)(Diameter * 0.5f);
        //Положение картинки
        //центр вращения должен быть смещён на 19% ширины
        var x = -w * 0.19f;
        //центр вращения должен быть смещён на 50% высоты 
        var y = -h * 0.5f;
        using (var bmp = new Bitmap(Arrow, new Size(w, h)))
        {
            e.Graphics.DrawImage(bmp, x, y);
        }
    }
 
    #endregion
}
4
Миниатюры
Вращение изображения  
Вложения
Тип файла: zip Speedometer.zip (34.2 Кб, 10 просмотров)
aleksandr_l
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 32
30.03.2017, 20:13  [ТС] 4
ViterAlex, Спасибо огромное, то что нужно.
Просто недавно в C# вникать начал и пока не очень понимаю некоторые нюансы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2017, 20:13

Вращение PictureBox
Здравствуйте! Пытаюсь реализовать одну вещь: есть пикчербокс с картинкой ручки...

Вращение картинки
Здраствуйте,я здесь новичок,не могу разобраться с программой,необходимо,чтоб...

Вращение и масштабирование !
Нужно добавить вращение и масштабироваиние звезды . Подскажите как это сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru