none
Problema en interfaz gráfica RRS feed

  • Pregunta

  • Buenos días tengo un problema con la interfaz gráfica de una aplicación y hasta ahora no se como resolverla, me explico: cuando cargo un formulario este hace un efecto como de flasheo antes de mostrar los componentes del mismo, he puesto la propiedad de double buffer a true y ha mejorado pero aún así me sigue pasando esto, les muestro aquí el código de carga de mi formulario, es un formulario hecho con la herramienta de diseño...

    Private Sub froventas_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.MdiParent = froinicio
            ocultar()  ''oculto dos cajas que ocupo para hacer operaciones pero que no es necesario que las vea el usuario
            Dim cadena2 As String = "SELECT Fecha, Producto, Inversion, Ganancia, Precio,Codigo, Cantidad, Total, Clasificación FROM Ventas2 "
            conectar()  '''abro la conexión
            llenargrid(Me.grillaventas, cadena2)
            vistagrid()
            sqll = "SELECT Producto FROM Productos"
            llenarcombotodos(Me.Texproducto, sqll)  ''llamo a un sub publico que llena un combobox
            desconectar()  '' cierro la conexión
            Texcantidad.Text = 1
            fechahoy.Text = Today.Date
            formatofro()
            If grillaventas.Rows.Count = 0 Then
            Else
                sumargrid()
                formatofro()
            End If
            Dim cuadrito As New ToolTip   '' esto lo hago para mostrar indicaciones sobre un cuadro de texto
            cuadrito.SetToolTip(Me.Texcantidad, "Para ingresar cantidades decimales se debe utilizar (,). Ejemplo: 1,5")
    
    
        End Sub

    Esto no solo me pasa en este formulario me pasa en otros también...

    Así es como me muestra la pantalla unas decimas de segundo antes de abrirla por completo...

    El color café es del fondo de la pantalla principal, ¿ Que puedo hacer para corregir este efecto y que se vea una interfaz solida???

    martes, 14 de junio de 2016 15:29

Respuestas

  • El efecto es claro. Es la manera habitual en la que se pintan los formularios (y es la manera en la que uno pintaría cualquier ventana de windows): se pintan las partes del fondo de la ventana que quedarán despejadas. Aquellas áreas que luego serán cubiertas por los controles, son ignoradas. A este estilo se le llama clipchildren.

    Prueba con este código agregado a tu formulario

    Const WS_CLIPCHILDREN As Integer = &H2000000
    Protected Overrides ReadOnly Property CreateParams() As CreateParams
    	Get
    		Dim cp As CreateParams = MyBase.CreateParams
    		cp.Style = cp.Style And Not WS_CLIPCHILDREN 
    		Return cp
    	End Get
    End Property

    No sabría decirte por qué estás viendo el pintado en etapas. Aunque suele suceder con bastante frecuencia, con bastantes programas. Amén de otros efectos de "pintado". A partir de longhorn, las ventanas dejan de pintar en la pantalla, y aparece un nuevo dispositivo que se encarga de ello: el desktop window manager.




    miércoles, 15 de junio de 2016 15:35

Todas las respuestas

  • Pone el código en el evento Shown del formulario.

    Saludos, Javier J

    martes, 14 de junio de 2016 15:37
  • Lo he cambiado pero no me sigue ocurriendo lo mismo, el efecto al cargarlo es el mismo tarda en mostrarlo completo un poco.
    martes, 14 de junio de 2016 16:18
  • Edgar Martínez,

    Es posible que el delay que obtienes se produzca por el tiempo requerido al abrir una conexión, ejecutar la consulta y obtener los datos, entiendo que todo eso -junto con la muestra de los componentes visuales del formulario- suceden dentro del mismo proceso . ¿Has probado omitiendo los procedimientos de carga de datos? ¿Tienes el mismo "efecto"?

    martes, 14 de junio de 2016 16:34
  • Prueba a poner SuspendLayout() al principio de tu load y cuando termines ResumeLayout()

    https://msdn.microsoft.com/es-es/library/system.windows.forms.control.suspendlayout(v=vs.110).aspx

    https://msdn.microsoft.com/es-es/library/y53zat12(v=vs.110).aspx


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    martes, 14 de junio de 2016 17:11
  • También puedes usar el Api de Windows como se muestra en la solución de este hilo

    http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 14 de junio de 2016 17:20
  • Yo también llegue a pensar que era eso, pero lo extraño Williams es que aunque quite todos los procedimientos en la carga me sigue pasando lo mismo entonces creo que no es por el tiempo que toman estos procesos...
    miércoles, 15 de junio de 2016 14:25
  • El efecto es claro. Es la manera habitual en la que se pintan los formularios (y es la manera en la que uno pintaría cualquier ventana de windows): se pintan las partes del fondo de la ventana que quedarán despejadas. Aquellas áreas que luego serán cubiertas por los controles, son ignoradas. A este estilo se le llama clipchildren.

    Prueba con este código agregado a tu formulario

    Const WS_CLIPCHILDREN As Integer = &H2000000
    Protected Overrides ReadOnly Property CreateParams() As CreateParams
    	Get
    		Dim cp As CreateParams = MyBase.CreateParams
    		cp.Style = cp.Style And Not WS_CLIPCHILDREN 
    		Return cp
    	End Get
    End Property

    No sabría decirte por qué estás viendo el pintado en etapas. Aunque suele suceder con bastante frecuencia, con bastantes programas. Amén de otros efectos de "pintado". A partir de longhorn, las ventanas dejan de pintar en la pantalla, y aparece un nuevo dispositivo que se encarga de ello: el desktop window manager.




    miércoles, 15 de junio de 2016 15:35
  • walter_5 Te agradezco tu ayuda la cual funciona bien pero solo cuando no llamo a ningún procedimiento en la carga del formulario, al llamarlo la situación empeora, creo que voy a crear un hilo para realizar estos procedimientos...
    miércoles, 15 de junio de 2016 16:55
  • He resuelto un problema de carga en la interfaz gráfica con un efecto de opacidad, poniendo la opacidad a cero y después lo voy incrementando con un Timer, el problema es que el efecto funciona bien con algunos formularios, pero cuando se trata de formularios hijo, no funciona!!! hay algo que pueda hacer para que se pueda aplicar este efecto.

    He probado poniendo la propiedad de formulario hijo hasta el final del efecto pero se ve otra vez el efecto de flasheo, les agradeceré su ayuda...

    jueves, 16 de junio de 2016 16:11
  • El layered solamente aplica a los popups no a los childwindows. En winforms los únicos formularios que son childwindows son los mdichild, con ellos el layered no debería funcionar.
    jueves, 16 de junio de 2016 16:39
  • Entonces no puedo aplicar ningún efecto a los formularios hijo???

    jueves, 16 de junio de 2016 17:26
  • Hola, probaste hacer algo como esto?:

     For Each formHijos As Form In Me.MdiChildren
                formHijos.Opacity = valor
    valor= valor + 1
            Next


    Podrías poner eso en el evento del timer_tick, valor seria la variable que se incrementa para ir aumentando la opacidad

    sábado, 18 de junio de 2016 18:15