Estoy haciendo una aplicación winforms. Una de las características espero a implementar es una rotación del engranaje en la casa.

Cuando el formulario se carga, se debe pasar a través de la imagen de la marcha, y debe girar en su lugar.

Pero todo lo que tengo hasta ahora es la RotateFlip y que solo voltea la imagen.

Hay una manera de hacer que el engranaje de vuelta en su lugar cuando el ratón se sitúa encima de él?

El código que tengo hasta ahora es:

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;
    }

Como he dicho, sólo quiero girar el engranaje. Estoy tratando de hacer esto en una aplicación de formularios de Windows. El Uso De C#. Marco 4

  • la forma más sencilla podría ser la creación de un GIF animado y dejar que el picturebox hacer el trabajo por usted
  • Es bastante simple, por el dibujo de la imagen (en lugar de establecer) y la transformación de los Gráficos..
  • Es posible que desee tener una mirada en ejemplo de una cosa mediante actual, que no es obsoleto .Neto de la interfaz de usuario de Windows de la tecnología, lo que elimina la necesidad de estúpido «dibujo» hacks y similares, y reduce de esta tarea a un mero 2 de la línea de Enlace de datos de la cosa.

2 Comentarios

  1. 6

    Tendrás que utilizar Timer para crear la rotación de la Image. No hay ningún método integrado que existe para la rotación.

    Crear un temporizador:

    Timer rotationTimer;

    Inicializar el temporizador en el constructor de la forma y crear PictureBox MouseEnter y MouseLeave eventos:

    //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;

    A continuación, crear su 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();
    }
  2. 6

    Puede utilizar el Graphics.RotateTransform método como este, yo uso un doublebuffered Panel, un Temporizador y dos variables de clase..

    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
    }

    Asegúrese de que la imagen es cuadrada y tiene el equipo en el medio!! Aquí es un buen uno:

    Cómo girar la imagen en el cuadro de imagen

    Aquí es un flickerfree doublebuffered Panel:

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

    Actualización: en Lugar de un Panel, que es un Container de control y no quería dibujar en que usted puede utilizar un Picturebox o un Label (con Autosize=false); ambos tienen la DoubleBuffered propiedad de encendido de la caja y el soporte de dibujo mejor que Panels hacer.

    • buena respuesta también. gracias por las fotos. me esfuerzo para encontrar en la web, que me gusta
    • La buena suerte. Puesto que usted está utilizando Shaharyar la solución, que no gire, pero simplemente voltea a 90°, tendrás que buscar un equipo que se ve bien con estos grandes incrementos..Las imágenes de arriba tienen un 60° simetría (en realidad se rompe un poco por un patrón de superposición.) Estos no se ven bien cuando se voltea.. El número de dientes debe ser divisible por 3, pero no por 2 o 4. Puedo agregar uno con 15 cv..
    • gracias por el consejo

Dejar respuesta

Please enter your comment!
Please enter your name here