none
Manejar la barra de Scroll de un Formulario MDI RRS feed

  • Pregunta

  • Buenas.
    Tengo un Formulario MDI, y dentro de él cargo un nuevo Formulario hijo, al que le asigno su propiedad MdiParent al Formulario anterior.
    El childForm es un formulario que tiene un Height superior al Formulario MDI, por lo tanto, aparecen unas barras de Scroll en el Formulario MDI para poder visualizar cualquier punto del formulario hijo.
    Hasta aquí todo ok.
    El problema ahora es que cuando giro con la rueda del mouse (MouseWheel) esperaba que esa barra de scroll se moviera, pero no es así.
    Saben cómo capturar ese evento (no se si se ha de capturar el evento MouseWheel del hijo o del MDI, no lo consigo con ninguno) y cómo provocar un avance del scroll o un retroceso, manualmente?
    Gracias por vuestra ayuda.
    Saludos.
    miércoles, 9 de septiembre de 2009 8:28

Todas las respuestas

  • Hola:

    Mientras encuentras una solución, lo mismo te sirve trabajar sin formulario hijos, es decir, como si el formulario secundario fuera un control más del formulario principal.

    Utilizando código de Visual Basic .net, ejecutarías lo siguiente:

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    
            ' Al formulario principal, le indicamos que
            ' permita el desplazamiento automático.
            '
            Me.AutoScroll = True
    
            ' Referenciamos el segundo formulario
            Dim frm As New Form2
            frm.TopLevel = False
            frm.Show()
    
            ' Lo añadimos a la colección de controles
            Me.Controls.Add(frm)
    
        End Sub
    

    Un saludo


    Enrique Martínez [MS MVP - VB]
    jueves, 10 de septiembre de 2009 17:08
  • Hola Enrique.
    Muchas gracias por tu respuesta.
    La verdad es que he realizado algunas pruebas, y por un lado mejora la parte del scroll, puesto que ya me hace caso! :-) Pero por otro lado, tiene otros comportamientos extraños.
    Por ejemplo, es cierto que ahora, teniendo el  formulario "interior" un HEIGHT superior, aparecen las barras de scroll en el formulario "contenedor" (por llamarlo de alguna forma) y así podemos llegar a las distintas partes del Form "interior".
    Pero si le das al botón de MAXIMIZAR del formulario interior, la cosa toma un comportamiento extraño. Para empezar hay partes del formulario a las que es imposible llegar a visualizar.
    La verdad es que no tengo ningún requerimiento de mi cliente, si no más bien mío. Sólo pretendo un esquema de aplicación lógico y hecho con buenas prácticas. Una de las cosas "lógicas" que veo, es que funcione la barra de scroll con el MouseWheel. De ahí mi pregunta.
    En cualquier caso, gracias por tu ayuda.
    De momento he dejado la aplicación configuirada de esta forma.
    Aunque esto me ha obligado a prescindir del uso de MDI, pero en fin, tampoco lo requería.
    Saludos.
    lunes, 14 de septiembre de 2009 16:05
  • Otra cosa.
    Parece ser que con el código que me facilitaste, ahora los formularios que se abren, se abren por debajo del que ya se está mostrando, en vez de hacerlo por encima, como sería lógico.
    ¿Se te ocurre una solución a esto?
    Gracias!
    lunes, 14 de septiembre de 2009 16:50
  • Una vez añadido el formulario a la colección Controls, llama a su método BringToFront.

     

     

            ' Lo añadimos a la colección de controles
            Me.Controls.Add(frm)
    
            ' Mostramos el control al frente del orden Z
            frm.BringToFront()

     


    Enrique Martínez [MS MVP - VB]
    martes, 15 de septiembre de 2009 15:07
  • Hola de nuevo Enrique.
    Gracias por tu respuesta. Ahora ha mejorado un poco la cosa.
    Pero, qué me dices de esto?

    Yo dije:
    Pero si le das al botón de MAXIMIZAR del formulario interior, la cosa toma un comportamiento extraño. Para empezar hay partes del formulario a las que es imposible llegar a visualizar.

    La verdad es que he vuelto al esquema de formularios MDI. Porqué me di cuenta que, con el esquema de MDI, si al cargar el formulario grande, lo maximizo, entonces siguen apareciendo las barras de scroll en el MDI, y ahora si, funcionan con el movimiento del Mouse Wheel. Lo único es que al estar la ventana restaurada no funciona.
    Entonces, en los formularios que son más "altos" que el MDI, en su código les pongo esto:

    Form_Load -> Me.WindowState = WindowState.Maximized

    Form_Closing -> Me.WindowState = WindowState.Normal

    La verdad, tampoco veo muy "standar" hacer esto, pero el resultado final me gusta más.
    Lo que quisiera saber de veras, es el esquema a seguir para realizar una aplicación MDI normal y corriente, con los comportamientos que se le presuponen.

    Gracias por todo.
    Un saludo.
    miércoles, 16 de septiembre de 2009 11:00
  • "ecoJortx" escribió:

    > Pero, qué me dices de esto?
    >
    > Yo dije:
    > Pero si le das al botón de MAXIMIZAR del formulario interior, la cosa toma un
    > comportamiento extraño. Para empezar hay partes del formulario a las que
    > es imposible llegar a visualizar.


    ¿Y qué quieres que te diga? :-)

    Si estudias el código fuente propuesto, lo mismo encuentras la respuesta en la siguiente asignación que se hace:

            frm.TopLevel = False

    Estamos indicando que el formulario NO debe mostrarse como una ventana de nivel superior, por tanto, lo mismo pierde las características propias de un formulario normal, porque si no te has dado cuenta, estamos tratando al formulario como si fuera un control cualquiera, como por ejemplo un simple control Button o TextBox, incluido dentro de otro formulario que actúa de contenedor. Es decir, no se trata de un formulario como los que estamos acostumbrados a trabajar.

    > Lo que quisiera saber de veras, es el esquema a seguir para realizar una
    > aplicación MDI normal y corriente, con los comportamientos que se le presuponen.

    ¿El esquema? Dependerá del diseño que le desees dar a tu aplicación MDI. ¡No sé! No conozco problemas aparentes para diseñar una aplicación con un formulario MDI y que a su vez tenga formulario hijos.




    Enrique Martínez [MS MVP - VB]
    miércoles, 16 de septiembre de 2009 11:48
  • Hola Enrique.
    Estoy de acuerdo con lo que comentas, por lo tanto, está claro que he de volver al esquema MDI, puesto que mis Formularios SI deben ser Forms en toda regla, y no tomar un comportamiento de Control, y que de esta forma todavía traiga más sorpresas.
    De hecho, podemos empezar el hilo de nuevo :-) Con mi primera pregunta basta para detectar el problema aparente que yo SI tengo/considero.
    Se trata del hecho de abrir un Form hijo, y que no pueda mover la barra de Scroll, que automáticamente muestra el Form MDI para poder acceder a las partes no visibles del Formulario hijo.
    Lo que veo es que si maximizo ese Form Hijo, entonces la barra de Scroll se mueve con el Mouse Wheel. En cambio si la vuelvo a restaurar (como su estado inicial) el Form MDI sigue mostrando la barra de scroll pero ya no me hace caso al movimiento del Mouse Wheel.
    Entonces, este es el comportamiento que presupongo que debería funcionar, y que si no es así, de ahí mi consulta de cómo hacer para que SI funcione.
    Espero haberme explicado de forma correcta.
    Muchas gracias por vuestra ayuda.
    Saludos.
    jueves, 17 de septiembre de 2009 11:16
  • > De hecho, podemos empezar el hilo de nuevo

    Pues si quieres que comencemos de nuevo el hilo, te diré lo mismo que ya te indiqué: mientras encuentras una solución, lo mismo te sirve trabajar sin formulario hijos, ... :-)

    Ignoro cómo puedes hacer funcionar la rueta del ratón para desplazar formularios hijos, porque las propiedades IsMdiContainer y AutoScroll son incompatibles, al menos mientras que ésta última tenga el valor True.

    Si el valor de la propiedad AutoScroll es True, se podrá utilizar la rueda del ratón o las propias barras de desplazamiento, para visualizar los CONTROLES que se encuentra fuera del área cliente de un formulario, de ahí que te comentara que usaras los formularios hijos como si de un control cualquiera se tratara.

    ¿Que no te sirve? Pues lo siento muchísimo, pero por ahora no se me ocurre otra solución. :-)


    Enrique Martínez [MS MVP - VB]
    sábado, 19 de septiembre de 2009 12:09
  • Pues si quieres que comencemos de nuevo el hilo, te diré lo mismo que ya te indiqué: mientras encuentras una solución, lo mismo te sirve trabajar sin formulario hijos, ... :-)


    Si, ese fue tu primer aporte, pero ya te comenté que me trae todavía más problemas. O sea, en realidad no me sirve. Pero muchas gracias por ofrecerme una alternativa que quizá pudiera haberme ido bien.

    Ignoro cómo puedes hacer funcionar la rueta del ratón para desplazar formularios hijos, porque las propiedades IsMdiContainer y AutoScroll son incompatibles, al menos mientras que ésta última tenga el valor True.

    Si, este detalle está claro. Me doy cuenta cambiando entre una y la otra. Activas la propiedad AutoScroll, se desactiva la propiedad IsMdiContainer. No se si la solución pasará por la propiedad Autoscroll, o cualquier otra forma. La verdad es que no me importa. Simplemente deseo ver un resultado satisfactorio.


    ¿Que no te sirve? Pues lo siento muchísimo, pero por ahora no se me ocurre otra solución. :-)


    Muy agradecido por tu tiempo. A ver si alguna otra persona tiene alguna idea y podemos ver las cosas desde algún punto de vista diferente.
    Saludos.


    lunes, 21 de septiembre de 2009 8:45