none
WindowsForm RGB RRS feed

  • Pregunta

  • Buenas:

    Quiero como indica en la captura de abajo, cambiar de color del Panel1 con los trackBar añadidos.

    No me funciona.

    Códigos que he hecho hasta ahora.

    using System.Drawing;
    using System.Windows.Forms;
    
    namespace Form_RGB_02
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void panel1_Paint(object sender, PaintEventArgs e)
            {
                panel1.BackColor = Color.FromArgb(trackBar_Rojo.Value, trackBar_Verde.Value, trackBar_Azul.Value);
    
                label_Rojo.Text = trackBar_Rojo.Value.ToString();
                label_Verde.Text = trackBar_Verde.Value.ToString();
                label_Azul.Text = trackBar_Azul.Value.ToString();
            }
        }
    }

    ¿Alguna idea?

    Saludos.

    Edito:

    Ahora lo he hecho con Timer cada 100 ms.

            private void timer1_Tick(object sender, EventArgs e)
            {
                panel1.BackColor = Color.FromArgb(trackBar_Rojo.Value, trackBar_Verde.Value, trackBar_Azul.Value);
    
                label_Rojo.Text = trackBar_Rojo.Value.ToString();
                label_Verde.Text = trackBar_Verde.Value.ToString();
                label_Azul.Text = trackBar_Azul.Value.ToString();
            }

    ¿No hay otra manera de hacerlo sin usar Timer?

    Gracias.


    http://electronica-pic.blogspot.com


    • Editado Metaconta domingo, 21 de marzo de 2021 8:59
    domingo, 21 de marzo de 2021 8:42

Respuestas

  • Puedes utilizar el evento ValueChanged del Trackbar. Si quieres, basta con que escribas un único manejador para el evento, y puedes conectar los tres trackbars al mismo manejador.

    Dentro del manejador, podrías llamar a panel1.Invalidate() y eso dispararía el evento panel1_Paint que tenías en tu primer ejemplo de código.

    Sin embargo, no recomiendo hacerlo así. No tiene sentido hacer lo que estás haciendo dentro del panel1_Paint, puesto que las instrucciones que contiene dentro no corresponden al Paint (no hacen nada con el e.Graphics). Es preferible que tomes esas líneas de código y las metas directamente en el ValueChanged del Trackbar.

    • Marcado como respuesta Metaconta lunes, 22 de marzo de 2021 7:30
    domingo, 21 de marzo de 2021 9:55
  •  No se si lo que hice es lo más adecuado [...]

    Sí, me parece perfectamente adecuado y es una magnífica solución. En el evento de cada trackbar cambia solo el label afectado por ese trackbar, con lo que produce los cambios mínimos necesarios, y el cambio de backcolor del panel está en una única rutina invocada desde los tres eventos, con lo que respeta el principio de DNRY ("do not repeat yourself"). Buen trabajo.
    • Marcado como respuesta Metaconta lunes, 22 de marzo de 2021 7:30
    lunes, 22 de marzo de 2021 7:04

Todas las respuestas

  • Puedes utilizar el evento ValueChanged del Trackbar. Si quieres, basta con que escribas un único manejador para el evento, y puedes conectar los tres trackbars al mismo manejador.

    Dentro del manejador, podrías llamar a panel1.Invalidate() y eso dispararía el evento panel1_Paint que tenías en tu primer ejemplo de código.

    Sin embargo, no recomiendo hacerlo así. No tiene sentido hacer lo que estás haciendo dentro del panel1_Paint, puesto que las instrucciones que contiene dentro no corresponden al Paint (no hacen nada con el e.Graphics). Es preferible que tomes esas líneas de código y las metas directamente en el ValueChanged del Trackbar.

    • Marcado como respuesta Metaconta lunes, 22 de marzo de 2021 7:30
    domingo, 21 de marzo de 2021 9:55
  • Buenas:

    Me funciona de maravilla. No se si lo que hice es lo más adecuado, pero funciona.

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace Form_RGB_02
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Panel();
            }
            
            private void trackBar_Rojo_ValueChanged(object sender, EventArgs e)
            {
                Panel();
                label_Rojo.Text = trackBar_Rojo.Value.ToString();
            }
    
            private void trackBar_Verde_ValueChanged(object sender, EventArgs e)
            {
                Panel();
                label_Verde.Text = trackBar_Verde.Value.ToString();      
            }
    
            private void trackBar_Azul_ValueChanged(object sender, EventArgs e)
            {
                Panel();
                label_Azul.Text = trackBar_Azul.Value.ToString();
            }
    
            void Panel()
            {
                panel1.BackColor = Color.FromArgb(trackBar_Rojo.Value, trackBar_Verde.Value, trackBar_Azul.Value);
            }
        }
    }

    Saludos.


    http://electronica-pic.blogspot.com


    • Editado Metaconta domingo, 21 de marzo de 2021 23:08
    domingo, 21 de marzo de 2021 23:07
  •  No se si lo que hice es lo más adecuado [...]

    Sí, me parece perfectamente adecuado y es una magnífica solución. En el evento de cada trackbar cambia solo el label afectado por ese trackbar, con lo que produce los cambios mínimos necesarios, y el cambio de backcolor del panel está en una única rutina invocada desde los tres eventos, con lo que respeta el principio de DNRY ("do not repeat yourself"). Buen trabajo.
    • Marcado como respuesta Metaconta lunes, 22 de marzo de 2021 7:30
    lunes, 22 de marzo de 2021 7:04