C sharp - Flicks en la apertura de un form

 
Vista:
Imágen de perfil de Manuel F.
Val: 63
Ha disminuido 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Flicks en la apertura de un form

Publicado por Manuel F. (33 intervenciones) el 14/06/2016 01:43:04
Saludos a todos !!!

Alguien tiene alguna idea de como prevenir los "flicks" (parapadeo) a la hora de mostrar un form que se carga desde otro, o un único form con el que arranca una app???

El asunto es más o menos así... Estoy diseñando una app que contiene varios forms: un splash, un para el login, uno como base o plataforma (una especie de MDI, pero no lo es) con barra personalizada de menú, con botones basados en un PictureBox con su respectiva imagen a manera de icono. Cada form tiene su respectiva imagen de fondo menos el splash que presenta texto informativo personalizado mediante el uso del GDI+.

Hasta ahí, todo bien (en teoría...), Cuando arranca la aplicación con el splash, sin novedad aparente, luego este form hace su respectivo llamado al form correspondiente al login empieza la primera cagada: un flick que hasta un ciego lo nota, Co... de su madre !!! A continuación, cuando el login realiza su trabajo y llama al form que hace de 'Plataforma' (abre maximizado), otro espantoso flick y más notorio todavía, Co... de su madre nuevamente !!! h.d.p. !!!

He probado las soluciones que dan en la web msdn (sirven... para una mierd... !!!), y en otros sitios, pero nada !!! Insisto, que tiene que poderse lograr, porque existen infinidades de app's que muestran formularios cargadísimos tanto en controles como efectos y estos abren a la perfección sin flicks de ningún tipo !!!

Si alguien ha encontrado la solución, por favor dónela !!!


Saludos !!!
Manuel F. Borrego S.
Barcelona, Edo. Anzoátegui. Venezuela.
[Mientras nos permitan seguir comunicándonos !!!]
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Flicks en la apertura de un form

Publicado por El Benjo (4 intervenciones) el 14/06/2016 06:24:19
Hola.

Cuando dices que has intentado lo que dice en MSDN supongo que hablad del doble buffer. Si esto no te funciona entonces fíjate si no estás usando imágenes con una resolución muy grande, es posible que el parpadeo se deba a eso.

Si nada de esto te funciona entonces dinos que es lo que ya has intentado o muestra parte de tu código donde manejas la parte gráfica.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Flicks en la apertura de un form

Publicado por Carlos (35 intervenciones) el 14/06/2016 18:12:23
Yo creo que la mejor manera de ayudarte seria viendo el código, manejar gráficos suele ser bien doloroso en ocasiones, más si no se hace de la manera correcta. Como sea te puedo dar alguna información que puede serte de utilidad.

En ocasiones aplicar el doublebuffer a un Form no es suficiente para acabar con el flickering, si en esta forma está usando controles que manejar garfios por su cuenta, como PictureBox, o estas dibujando sobre algún otro control dentro de la forma, el double buffer del Form no será suficiente, en ese caso es necesario activar el double buffer para cada control que estes dibujando. El problema con esto es que no todos los controles tiene a simple vista la propiedad DoubleBuffer, en algunos es una propiedad oculta y en otros es sencillamente una variable privada, para poder activar el DoubleBuffer en los controles la manera mas funcional que asegura el 90% de los casos es usando reflection, por ejemplo digamos que tienes uan forma con varios picturebox que cargan imágenes grandes o estás dibujando algo sobre ellos con un timer o algo, e en resumen tienes una carga grafica considerable en los controles de tu form lo que debes hacer

para activar el Double Buffer en cada uno de ellos incluso si la propiedad no es visible seria:
using System.Reflection; (Este namespace es requerido para esto)

//digamso que tienes
PictureBox pictureBox1;

//entonces:
PropertyInfo doubleBuffered = typeof(PictureBox).GetProperty("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance);

doubleBuffered.SetValue(pictureBox1, true);



esto lo puedes aplicar a cualquier control que no tenga la propiedad DoubleBuffered disponible.
Yo estoy 99% seguro que tu caso de flickering es perfectamente manejable, estoy casi seguro que algún detalle está mal o falta en tu código, no creo que tengas que llegar a soluciones extremas, pero si aún esto no resuelve tu problema, o sencillamente el control que estas usando no tiene doublebuffer, incluso accediendo por reflection, la única solución sería crear tu propio control, lo cual sería más complicado,
Y usar lo siquiente:

protected override CreateParams CreateParams
{
get
{
CreateParams p = base.CreateParams;
//WS_EX_COMPOSITED = 0x02000000
p.ExStyle |= 0x02000000;
return p;
}
}

esto lo colocas en el código de la forma on el el código de tu control creadto por ti.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Manuel F.
Val: 63
Ha disminuido 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Flicks en la apertura de un form

Publicado por Manuel F. (33 intervenciones) el 15/06/2016 00:02:54
Saludos El Benjo y Carlos !!!

Perdónenme que no suba el código y explicación respectiva de lo que hice, pero lo que estaba escribiendo aquí, era bien extenso y casi al final, solo faltando un poquito nada más, el navegador se reinició y no pude recuperar lo que estaba escribiendo... C. De La Mad...!!!

Voy a probar la solución que me sugieres Carlos...

De todas formas he aquí parte del código para el form Login:

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
string rutaImagenFondo = @"C:\VS2013\VC#2013\Apps para Windows" +
                        @"\Proyectos\Fondos (Imagenes)\PNG\FondoLoginReModDef_II.png";
 
                public Login()
                {
                        InitializeComponent();
 
                        txtUsuario.KeyUp += txtUsuario_KeyUp;
                        txtPassword.KeyUp += txtClave_KeyUp;
 
                        Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
                }
 
private void Login_FormClosing(object sender, FormClosingEventArgs e)
                {
                        if (!cierreTotal)
                        {
                                // Principal prc = new Principal();
                                PlataformaPrincipal pprc = new PlataformaPrincipal();
                                pprc.Show();
                        }
                }
 
                private void Login_Load(object sender, EventArgs e)
                {
                        // TrazarFondoParaTextBoxs();
 
                        this.BackgroundImage = Image.FromFile(rutaImagenFondo);
                        this.DoubleBuffered = true;
                        this.BackgroundImageLayout = ImageLayout.Stretch;
 
                        lblFecha.Text = DateTime.Now.ToLongDateString();
                        lblHora.Text = DateTime.Now.ToLongTimeString();
                }


Este es el del form principal, llamado PlataformaPrincipal:

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#region Variables del Form "PlataformaPrincipal".
                Forms.AdministradorPrincipal admPrc = null;
                Size tamEscritorio;
                int anchoEscritorio;
                int alturaBarraTitulo = 36;
                int alturaLabel, alturaLabelFecHorUsr,
                        alturaPnlBotonMin, alturaPnlBotonX;
                int anchoLabel, ancholabelFec,
                        anchoLabelHor, anchoLabelUsr,
                        anchoPnlBotonX, anchoPnlBotonMin;
                int xlbl, ylbl;
                int xlblFec, xlblHor, xlblUsr, ylblFHU;
                int xPnlMin, yPnlMin;
                int xPnlX, yPnlX;
                string rutaImagenFondo = @"C:\VS2013\VC#2013\Apps para Windows" +
                        @"\Proyectos\Fondos (Imagenes)\PNG\Fondo Modificado" +
                        @"\FondoMainForm_971x667_I.png";
                Color colorNormal = Color.FromArgb(255, 0, 0, 200);
                Color colorResaltado = Color.FromArgb(255, 0, 0, 150);
                Image imgFlechaNormal = Properties.Resources.FlechaDerecha15x15AA;
                Image imgFlechaResaltada = Properties.Resources.FlechaDerecha15x15BB;
                string tipoAdministrador = "";
                #endregion
 
public PlataformaPrincipal()
                {
                        InitializeComponent();
 
                        lblBotonX.Parent = pnlBotonX;
                        lblBotonMin.Parent = pnlBotonMin;
 
                        Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
 
                        // ========================================================== //
                        // ---------------------------------------------------------
                        // Para los 'Botones X' (de cierre) de las las barras de
                        // título (creación de eventos) en cada uno de los DGV's...
                        // ---------------------------------------------------------
                        BotonXListAdmins.MouseDown += BotonXListAdmins_MouseDown;
                        BotonXListAdmins.MouseHover += BotonXListAdmins_MouseHover;
                        BotonXListAdmins.MouseLeave += BotonXListAdmins_MouseLeave;
                        BotonXListAdmins.MouseUp += BotonXListAdmins_MouseUp;
                        // ========================================================== //
                }
 
private void DefinirControlesDeLaPlataforma()
                {
                        tamEscritorio = SystemInformation.PrimaryMonitorSize;
 
                        alturaBarraTitulo = 36;
                        alturaLabel = lblTitulo.Height;
                        alturaLabelFecHorUsr = lblFecha.Height;
                        anchoLabel = lblTitulo.Width;
                        anchoEscritorio = tamEscritorio.Width;
 
                        xlbl = (anchoEscritorio - anchoLabel) / 2;
                        ylbl = (alturaBarraTitulo - alturaLabel) / 2;
                        lblTitulo.Location = new Point(xlbl, ylbl);
                        // -----------------------------------------------------------------
                        // Se establece y define el pnlBotonX "Botón de Cerrar - X"...
                        alturaPnlBotonX = pnlBotonX.Height;
                        anchoPnlBotonX = pnlBotonX.Width;
 
                        xPnlX = anchoEscritorio - anchoPnlBotonX - 4;
                        yPnlX = (alturaBarraTitulo - alturaPnlBotonX) / 2;
                        pnlBotonX.Location = new Point(xPnlX, yPnlX);
                        // -----------------------------------------------------------------
                        // Se establece y define el pnlBotonMin "Botón de Minimizar"...
                        alturaPnlBotonMin = pnlBotonMin.Height;
                        anchoPnlBotonMin = pnlBotonMin.Width;
 
                        xPnlMin = anchoEscritorio - anchoPnlBotonMin - anchoPnlBotonX - 8;
                        yPnlMin = (alturaBarraTitulo - alturaPnlBotonMin) / 2;
                        pnlBotonMin.Location = new Point(xPnlMin, yPnlMin);
                        // -----------------------------------------------------------------
                        /* Se establecen: Fecha, Hora y Nombre del Usuario actual 
                         * así como también se define la posición en el Form 
                         * "PlataformaPrincipal"... */
                        lblFecha.Text = DateTime.Now.ToLongDateString();
                        lblHora.Text = DateTime.Now.ToLongTimeString();
                        lblUsuario.Text = Program.usuarioPrograma;
 
                        ancholabelFec = lblFecha.Width;
                        anchoLabelHor = lblHora.Width;
                        anchoLabelUsr = lblUsuario.Width;
 
                        ylblFHU = tamEscritorio.Height - 24;
                        lblF.Location = new Point(10, ylblFHU);
                        xlblFec = lblF.Width + 15;
                        lblFecha.Location = new Point(xlblFec, ylblFHU);
 
                        lblH.Location = new Point((xlblFec + lblFecha.Width + 50), ylblFHU);
                        xlblHor = lblH.Location.X + lblH.Width;
                        lblHora.Location = new Point(xlblHor, ylblFHU);
 
                        lblU.Location = new Point((tamEscritorio.Width - 350), ylblFHU);
                        xlblUsr = lblU.Location.X + lblU.Width;
                        lblUsuario.Location = new Point(xlblUsr, ylblFHU);
                }
 
                private void DefinirPosicionDeBotonesEnBarraDeBotones()
                {
                        // Botón de Salir de la App [pnlBotonSalir]...
                        pnlBotonSalir.Location = new Point(15, 58);
                        pnlBotonSalir.BackColor = Color.Transparent;
                        pnlBotonSalir.BackgroundImage = Properties.Resources.home;
 
                        // Botón de Salir de la App [pnlBotonAdministrador]...
                        pnlBotonAdministrador.Location = new Point(75, 58);
                        pnlBotonAdministrador.BackColor = Color.Transparent;
                        pnlBotonAdministrador.BackgroundImage = Properties.Resources.User2;
                }
 
                private void TrazarBarraDeEstado()
                {
                        Graphics grp = this.CreateGraphics();
 
                        grp.Clear(this.BackColor);
 
                        ShapeContainer lienzo = new ShapeContainer();
                        RectangleShape rectShpBarraEdo = new RectangleShape();
 
                        lienzo.Parent = this;
                        rectShpBarraEdo.Parent = lienzo;
 
                        rectShpBarraEdo.Size = new Size(tamEscritorio.Width - 2, 30);
                        rectShpBarraEdo.BorderWidth = 1;
                        rectShpBarraEdo.BorderColor = Color.FromArgb(255, 0, 150, 255);
                        rectShpBarraEdo.Location = new Point(1, tamEscritorio.Height - 30);
                }
 
                private void TrazarBarraDeBotones()
                {
                        Graphics grp = this.CreateGraphics();
 
                        grp.Clear(this.BackColor);
 
                        int ancho = tamEscritorio.Width - 16;
                        int altura = 64;
                        int xPos = (tamEscritorio.Width - ancho) / 2;
                        int yPos = 50;
 
                        ShapeContainer lienzo = new ShapeContainer();
                        RectangleShape rectShpBarBot = new RectangleShape();
 
                        lienzo.Parent = this;
                        rectShpBarBot.Parent = lienzo;
 
                        rectShpBarBot.Size = new Size(ancho, altura);
                        rectShpBarBot.BorderWidth = 1;
                        rectShpBarBot.CornerRadius = 3;
                        rectShpBarBot.BorderColor = Color.FromArgb(200, 180, 180, 180);
                        rectShpBarBot.Location = new Point(xPos, yPos);
                }

Espero poder llegar a la solución con la ayuda de uds !!!
Bueno eso es todo por el momento y gracias por tomarse la molestia en leer los post !!!


Saludos !!!
Manuel F. Borrego Sterling
Barcelona, Edo. Anzoátegui. Venezuela.
[Mientras nos permitan seguir comunicándonos...!!!]


PD: continúa en otro mensaje...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Manuel F.
Val: 63
Ha disminuido 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Flicks en la apertura de un form

Publicado por Manuel F. (33 intervenciones) el 15/06/2016 00:06:27
Continuación del mensaje anterior (por cuestión de exceso de caracteres...)...

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
131
132
private void TrazarBarraTitulo()
                {
                        Graphics grp = this.CreateGraphics();
 
                        grp.Clear(this.BackColor);
 
                        ShapeContainer lienzo = new ShapeContainer();
                        RectangleShape rectShpBarra = new RectangleShape();
 
                        lienzo.Parent = this;
                        rectShpBarra.Parent = lienzo;
 
                        rectShpBarra.Size = new Size(tamEscritorio.Width - 2, 36);
                        rectShpBarra.BorderWidth = 1;
                        rectShpBarra.BorderColor = Color.White;
                        rectShpBarra.Location = new Point(1, 1);
                }
 
                private void TrazarLineasDelMarco()
                {
                        ShapeContainer lienzo = new ShapeContainer();
                        LineShape lineaMarcoIzq = new LineShape();
                        LineShape lineaMarcoDch = new LineShape();
 
                        lienzo.Parent = this;
                        lineaMarcoIzq.Parent = lienzo;
                        lineaMarcoDch.Parent = lienzo;
 
                        lineaMarcoIzq.StartPoint = new Point(1, 1);
                        lineaMarcoIzq.EndPoint = new Point(1, tamEscritorio.Height - 2);
                        lineaMarcoIzq.BorderWidth = 2;
                        lineaMarcoIzq.BorderColor = Color.White;
 
                        lineaMarcoDch.StartPoint = new Point(tamEscritorio.Width - 2, 1);
                        lineaMarcoDch.EndPoint = new Point(tamEscritorio.Width - 2, tamEscritorio.Height - 2);
                        lineaMarcoDch.BorderWidth = 2;
                        lineaMarcoDch.BorderColor = Color.White;
                }
 
private void PlataformaPrincipal_Load(object sender, EventArgs e)
                {
                        DefinirControlesDeLaPlataforma();
                        DefinirPosicionDeBotonesEnBarraDeBotones();
 
                        this.BackgroundImage = Properties.Resources.FondoMainForm_971x667_I;
                        this.DoubleBuffered = true;
                        this.BackgroundImageLayout = ImageLayout.Stretch;
                        this.WindowState = FormWindowState.Maximized;
 
                        TrazarBarraDeEstado();
                        TrazarLineasDelMarco();
                        TrazarBarraTitulo();
                        TrazarBarraDeBotones();
                }
 
                protected override void OnPaint(PaintEventArgs e)
                {
                        base.OnPaint(e);
                        //
                }
 
                private void PlataformaPrincipal_Resize(object sender, EventArgs e)
                {
                        if (admPrc != null)
                        {
                                admPrc.WindowState = FormWindowState.Normal;
                        }
                }
 
private void Hora_Tick(object sender, EventArgs e)
                {
                        lblHora.Text = DateTime.Now.ToLongTimeString();
                }
 
#region Eventos de los controles de la "Barra de Botones".
                private void pnlBotonSalir_MouseDown(object sender, MouseEventArgs e)
                {
                        pnlBotonSalir.Size = new Size(48, 48);
                        pnlBotonSalir.BackgroundImageLayout = ImageLayout.Tile;
                        pnlBotonSalir.BorderStyle = BorderStyle.FixedSingle;
                }
 
                private void pnlBotonSalir_MouseHover(object sender, EventArgs e)
                {
                        pnlBotonSalir.Size = new Size(53, 53);
                        pnlBotonSalir.BackgroundImageLayout = ImageLayout.Zoom;
                }
 
                private void pnlBotonSalir_MouseLeave(object sender, EventArgs e)
                {
                        pnlBotonSalir.Size = new Size(48, 48);
                        pnlBotonSalir.BackgroundImageLayout = ImageLayout.Tile;
                }
 
                private void pnlBotonSalir_MouseUp(object sender, MouseEventArgs e)
                {
                        pnlBotonSalir.Size = new Size(48, 48);
                        pnlBotonSalir.BackgroundImageLayout = ImageLayout.Tile;
                        pnlBotonSalir.BorderStyle = BorderStyle.None;
 
                        Application.Exit();
                }
 
                private void pnlBotonAdministrador_MouseDown(object sender, MouseEventArgs e)
                {
                        pnlBotonAdministrador.Size = new Size(48, 48);
                        pnlBotonAdministrador.BackgroundImageLayout = ImageLayout.Tile;
                        pnlBotonAdministrador.BorderStyle = BorderStyle.FixedSingle;
                }
 
                private void pnlBotonAdministrador_MouseHover(object sender, EventArgs e)
                {
                        pnlBotonAdministrador.Size = new Size(53, 53);
                        pnlBotonAdministrador.BackgroundImageLayout = ImageLayout.Zoom;
                }
 
                private void pnlBotonAdministrador_MouseLeave(object sender, EventArgs e)
                {
                        pnlBotonAdministrador.Size = new Size(48, 48);
                        pnlBotonAdministrador.BackgroundImageLayout = ImageLayout.Tile;
                }
 
                private void pnlBotonAdministrador_MouseUp(object sender, MouseEventArgs e)
                {
                        pnlBotonAdministrador.Size = new Size(48, 48);
                        pnlBotonAdministrador.BackgroundImageLayout = ImageLayout.Tile;
                        pnlBotonAdministrador.BorderStyle = BorderStyle.None;
 
                        pnlMenuAdministrador.Visible = true;
                        pnlMnuAdmSombra.Visible = true;
                }
                #endregion


Saludos y Gracias !!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar