2014-10-19 2 views
3

Я делаю приложение winforms. Одна из возможностей, которую я надеюсь реализовать, - это вращающийся механизм в домашней форме.Как повернуть изображение в окне изображения

Когда загружается домашняя форма, вы должны навести курсор на изображение механизма, и он должен вращаться на месте.

Но все, что у меня есть, это RotateFlip, и это просто переворачивает изображение.

Есть ли способ заставить шестерню повернуться на месте, когда мышь нависает над ней?

код у меня до сих пор:

Bitmap bitmap1; 
    public frmHome() 
    { 
     InitializeComponent(); 
     try 
     { 
      bitmap1 = (Bitmap)Bitmap.FromFile(@"gear.jpg"); 
      gear1.SizeMode = PictureBoxSizeMode.AutoSize; 
      gear1.Image = bitmap1; 
     } 
     catch (System.IO.FileNotFoundException) 
     { 
      MessageBox.Show("There was an error." + 
       "Check the path to the bitmap."); 
     } 
    } 

    private void frmHome_Load(object sender, EventArgs e) 
    { 
     System.Threading.Thread.Sleep(5000); 
    } 

    private void frmHome_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     Application.Exit(); 
    } 

    private void pictureBox1_MouseHover(object sender, EventArgs e) 
    { 

     bitmap1.RotateFlip(RotateFlipType.Rotate180FlipY); 
     gear1.Image = bitmap1; 
    } 

Как я уже сказал, я просто хочу, чтобы включить передачу. Я пытаюсь сделать это в приложении Windows Form. Использование C#. Рамка 4

+2

самый простой способ может быть для создания анимированных GIF и пусть PictureBox сделать работу за вас – Plutonix

+0

Это довольно просто, рисуя изображение (вместо его настройки) и преобразуя графику. – TaW

+0

Возможно, вы захотите посмотреть [мой пример] (http://stackoverflow.com/a/14711744/643085) таких вещь, использующая текущую, не устаревшую .Net-технологию Windows UI, w он устраняет необходимость в глупых «взломах владельца» и т. п., и сводит эту задачу к простой двухстрочной привязке DataBinding. –

ответ

4

Чтобы создать поворот , вам необходимо использовать Timer. Для вращения нет встроенного метода.

Создание глобального таймера:

Timer rotationTimer; 

Инициализировать таймер в конструкторе формы и создавать PictureBoxMouseEnter и MouseLeave события:

//initializing timer 
rotationTimer = new Timer(); 
rotationTimer.Interval = 150; //you can change it to handle smoothness 
rotationTimer.Tick += rotationTimer_Tick; 

//create pictutrebox events 
pictureBox1.MouseEnter += pictureBox1_MouseEnter; 
pictureBox1.MouseLeave += pictureBox1_MouseLeave; 

Затем создать свой Event Handlers:

void rotationTimer_Tick(object sender, EventArgs e) 
{ 
    Image flipImage = pictureBox1.Image; 
    flipImage.RotateFlip(RotateFlipType.Rotate90FlipXY); 
    pictureBox1.Image = flipImage; 
} 

private void pictureBox1_MouseEnter(object sender, EventArgs e) 
{ 
    rotationTimer.Start(); 
} 

private void pictureBox1_MouseLeave(object sender, EventArgs e) 
{ 
    rotationTimer.Stop(); 
} 
3

Вы может использовать метод Graphics.RotateTransform: Я использую DoubleBuffered панель, таймер и две переменные класса ..

Bitmap bmp; 
float angle = 0f; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    bmp = new Bitmap(yourGrarImage); 
    int dpi = 96; 
    using (Graphics G = this.CreateGraphics()) dpi = (int)G.DpiX; 
    bmp.SetResolution(dpi, dpi); 
    panel1.ClientSize = bmp.Size; 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 

    angle+=2;    // set the speed here.. 
    angle = angle % 360; 
    panel2.Invalidate(); 
} 


private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    if (bmp!= null) 
    { 
      float bw2 = bmp.Width/2f; // really ought.. 
      float bh2 = bmp.Height/2f; // to be equal!!! 
      e.Graphics.TranslateTransform(bw2, bh2); 
      e.Graphics.RotateTransform(angle); 
      e.Graphics.TranslateTransform(-bw2, -bh2); 
      e.Graphics.DrawImage(bmp, 0, 0); 
      e.Graphics.ResetTransform(); 
    } 
} 

private void panel1_MouseLeave(object sender, EventArgs e) 
{ 
    timer1.Stop(); 
} 

private void panel1_MouseHover(object sender, EventArgs e) 
{ 
    timer1.Start(); 
    timer1.Interval = 10; // ..and/or here 
} 

Убедитесь, что изображение является квадратным и имеет зубчатое колесо в середине !! Вот хороший один:

enter image description hereenter image description heregear with 15 cogs

Вот flickerfree DoubleBuffered Группа:

public class Display : Panel 
{ 
    public Display() 
    { 
     this.DoubleBuffered = true; 
    } 
} 
+0

хорошо ответ тоже. спасибо за фото. я изо всех сил пытаюсь найти в Интернете, что мне нравится –

+1

Удачи. Поскольку вы используете решение Шахаряра, которое на самом деле не вращается, а просто переворачивается на 90 °, вам придется искать механизм, который хорошо выглядит с этими большими приращениями. Эти изображения имеют симметрию 60 ° (на самом деле сломанной немного по наложению рисунка.) Они не выглядят хорошо при переворачивании. Количество винтиков должно быть делимым на 3, но не на 2 или 4. Я добавляю один из 15 винтиков. – TaW

+0

спасибо за совет –

Смежные вопросы