Как да завъртите изображение в полето за картина

Правя 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


person Nicholas Aysen    schedule 19.10.2014    source източник
comment
най-лесният начин може да бъде да създадете анимиран GIF и да оставите картинната кутия да свърши работата вместо вас   -  person Ňɏssa Pøngjǣrdenlarp    schedule 19.10.2014
comment
Това е доста просто, като начертаете изображението (вместо да го настроите) и трансформирате графиката.   -  person TaW    schedule 19.10.2014
comment
Може да искате да разгледате моя пример за такова нещо, използващо текуща, неотхвърлена .Net Windows UI технология, което премахва необходимостта от глупави хакове за чертане на собственика и други подобни и намалява тази задача до просто 2-редово обвързване на данни.   -  person Federico Berasategui    schedule 20.10.2014


Отговори (2)


Ще трябва да използвате Timer, за да създадете ротация на Image. Не съществува вграден метод за ротация.

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

Timer rotationTimer;

Инициализирайте таймера в конструктора на формата и създайте PictureBox MouseEnter и 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();
}
person Shaharyar    schedule 19.10.2014

Можете да използвате метода Graphics.RotateTransform по този начин; Използвам панел с двойно буфериране, таймер и две променливи на клас.

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
}

Уверете се, че изображението е квадратно и има зъбно колело в средата!! Ето един хубав:

въведете описание на изображението туквъведете описание на изображението тукпредавка с 15 зъба

Ето панел с двойно буфериране без трептене:

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

Актуализация: Вместо Panel, което е контрола Container и всъщност не е предназначено да рисува върху него, можете да използвате Picturebox или LabelAutosize=false); и двата имат свойството DoubleBuffered включено от кутията и поддържат чертане по-добре от Panels.

person TaW    schedule 19.10.2014
comment
също добър отговор. благодаря за снимките. трудно намирам такива в мрежата, които харесвам - person Nicholas Aysen; 20.10.2014
comment
Късмет. Тъй като използвате решението на Shaharyar, което всъщност не се върти, а просто се обръща на 90°, ще трябва да потърсите зъбно колело, което изглежда добре с тези големи стъпки. Горните изображения имат 60° симетрия (всъщност нарушена малко с наслагване на шаблон.) Те не изглеждат добре, когато се обръщат.. Броят на зъбците трябва да се дели на 3, но не на 2 или 4. Добавям един с 15 зъбчета.. - person TaW; 20.10.2014