none
¿Cómo desactivar scrollbars de un MDI? RRS feed

  • Pregunta

  • Quisiera lograr esto para que, cuando los childs se minimicen no se vayan bien abajo. Me explico mejor: hay veces en las que la ventana minimizada del child se va tan abajo que no puede ser visualizada desde la pantalla, a menos que se usen scrollbars que me aparecen automáticamente.

     

    Desde ya, muchas gracias por su tiempo.


    Gabriela
    jueves, 20 de enero de 2011 22:06

Respuestas

  • Vos decís de escribir una subclase del mdiclient, digamos MiMDIClient para poder manipular los estilos en el WM_NCCREATE/WM_CREATE. Remover el mdiclient del mdiform, hacer un new de la clase MiMDIClient, y agregarla al mdiform.


    bueno, antes de ponerme a inventar busque en CodeProject y aqui esta un ejemplo de como hacer y esta lo que estaba mencionando.

    http://www.codeproject.com/KB/dialog/mdiclientcontroller.aspx

    Salu2,


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    sábado, 22 de enero de 2011 4:48
    Moderador
  • Quisiera lograr esto para que, cuando los childs se minimicen no se vayan bien abajo. Me explico mejor: hay veces en las que la ventana minimizada del child se va tan abajo que no puede ser visualizada desde la pantalla, a menos que se usen scrollbars que me aparecen automáticamente.

     

    Desde ya, muchas gracias por su tiempo.


    Gabriela


    se puede pero tiene sus issues...

    veamos, luego de leer tu pregunta sobre todo que es hacia un MDI y luego de responder a una pregunta similar en el foro de VB.Net

    cuando defines a un formulario como MdiContainer se agrega automaticamente un contenedor interno MdiClient que es donde se alojan los formularios que se cargan en la aplicación, así que a quien se le debe de aplicar ocultar las barras de desplazamiento es a este contenedor

    ejemplo:

        [DllImport("user32.dll")]
        private static extern int ShowScrollBar(IntPtr hWnd, int wBar, int bShow);
    
        protected override void WndProc(ref Message m)
        {
          HideMdiClientScrollBars();
          base.WndProc(ref m);
        }
        void HideMdiClientScrollBars()
        {
          MdiClient client = this.Controls.OfType<MdiClient>().Where(pre => pre is MdiClient).SingleOrDefault();
          if (client != null)
            ShowScrollBar(client.Handle, 3, 0);
        }
    
    sobreescribo el evento WndProc para no utilizar un Timer para estar intentando ocultar las barras de desplazamiento.

    el unico problema es que vas a ver parpadear las barras de desplazamiento mientras mueves un formulario fuera de los limites del formulario MDI luego de que lo dejas de mover desaparece el efecto porque el sistema esta intentando ocultar las barras de desplazamiento.

    intente aplicando SetWindowLong para cambiar los estilos de este contenedor pero siempre muestra las barras de desplazamiento.

    bien... creo que de esta manera te lo resolveria temporalmente en caso de que lo quieras aplicar así, para seguir indagando en como poder quitarle estos estilos a este contenedor para no tener ese efecto o sobre escribir el contenedor MdiClient con uno propio para quitar el efecto.

    Salu2,


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    viernes, 21 de enero de 2011 23:05
    Moderador
  • Vos decís de escribir una subclase del mdiclient, digamos MiMDIClient para poder manipular los estilos en el WM_NCCREATE/WM_CREATE. Remover el mdiclient del mdiform, hacer un new de la clase MiMDIClient, y agregarla al mdiform.


    para hacerlo funcionar, solo copia el archivo MdiClientController.cs a tu projecto, luego en el constructor del formulario principal cambialo a manera de que quede así:

        MdiClientController mdiClientController;
    
        public Principal()
        {
          mdiClientController = new MdiClientController(this);
          mdiClientController.AutoScroll = false;
          InitializeComponent();
        }
    
    

    si lo copias recuerda cambiar el Namespace de este archivo al namespace de tu projecto.

    Salu2,

     


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    sábado, 22 de enero de 2011 5:06
    Moderador

Todas las respuestas

  • private void Form1_MaximumSizeChanged(object sender, EventArgs e)
        {
          this.TopMost = true;
        }
    
    private void Form1_MinimumSizeChanged(object sender, EventArgs e)
        {
          this.TopMost = false;
        }

    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    jueves, 20 de enero de 2011 22:40
  • No me ha sido útil. Lo he probado tanto en el MDI como en el CHILD y nada.

    Voy a aclarar un poquito más.

    Tengo un MDI, dentro de él abro un CHILD maximizado. Cuando minimizo el MDI, lo hace también el CHILD. Pero el CHILD a veces se minimiza en la parte izquierda inferior del MDI y a veces el MDI es como si crease más área, porque sale un Scrollbar y me lo manda al CHILD minimizado bien abajo.

    ¿Alguna idea?


    Gabriela
    viernes, 21 de enero de 2011 3:47
  • :-)
    Hola Gabriela,

    Te propongo una solución alternativa:

    Verás, yo acabé harto de los entornos MDI por esto y por otras cosas (además de que desde hace tiempo ya no están de moda :-P). Por ese motivo decidí empezar a usar el enfoque de mostrar las ventanas hijas basado en pestañas, como hace el IDE de Visual Studio.

    Por si le quiers dar una ojeada, escribí un post al respecto.

    How to: Cómo insertar un WinForm dentro de un control TabPanel:
    http://geeks.ms/blogs/lfranco/archive/2008/07/01/how-to-c-243-mo-insertar-un-winform-dentro-de-un-control-tabpanel.aspx

    Un saludo y perdona por salirme por la tangente :-)


    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Follow me on Facebook or Twitter!

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Geeks: http://geeks.ms/blogs/lfranco

    viernes, 21 de enero de 2011 10:02
    Moderador
  • Quisiera lograr esto para que, cuando los childs se minimicen no se vayan bien abajo. Me explico mejor: hay veces en las que la ventana minimizada del child se va tan abajo que no puede ser visualizada desde la pantalla, a menos que se usen scrollbars que me aparecen automáticamente.

     

    Desde ya, muchas gracias por su tiempo.


    Gabriela


    se puede pero tiene sus issues...

    veamos, luego de leer tu pregunta sobre todo que es hacia un MDI y luego de responder a una pregunta similar en el foro de VB.Net

    cuando defines a un formulario como MdiContainer se agrega automaticamente un contenedor interno MdiClient que es donde se alojan los formularios que se cargan en la aplicación, así que a quien se le debe de aplicar ocultar las barras de desplazamiento es a este contenedor

    ejemplo:

        [DllImport("user32.dll")]
        private static extern int ShowScrollBar(IntPtr hWnd, int wBar, int bShow);
    
        protected override void WndProc(ref Message m)
        {
          HideMdiClientScrollBars();
          base.WndProc(ref m);
        }
        void HideMdiClientScrollBars()
        {
          MdiClient client = this.Controls.OfType<MdiClient>().Where(pre => pre is MdiClient).SingleOrDefault();
          if (client != null)
            ShowScrollBar(client.Handle, 3, 0);
        }
    
    sobreescribo el evento WndProc para no utilizar un Timer para estar intentando ocultar las barras de desplazamiento.

    el unico problema es que vas a ver parpadear las barras de desplazamiento mientras mueves un formulario fuera de los limites del formulario MDI luego de que lo dejas de mover desaparece el efecto porque el sistema esta intentando ocultar las barras de desplazamiento.

    intente aplicando SetWindowLong para cambiar los estilos de este contenedor pero siempre muestra las barras de desplazamiento.

    bien... creo que de esta manera te lo resolveria temporalmente en caso de que lo quieras aplicar así, para seguir indagando en como poder quitarle estos estilos a este contenedor para no tener ese efecto o sobre escribir el contenedor MdiClient con uno propio para quitar el efecto.

    Salu2,


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    viernes, 21 de enero de 2011 23:05
    Moderador
  • Vos decís de escribir una subclase del mdiclient, digamos MiMDIClient para poder manipular los estilos en el WM_NCCREATE/WM_CREATE. Remover el mdiclient del mdiform, hacer un new de la clase MiMDIClient, y agregarla al mdiform.


    no, el MdiClient es un control no controla estos mensajes del windows estos son controlados por el WndProc() del formulario, reemplazar el MdiClient seria solo para evitar que se muestren las barras de desplazamiento cuando un formulario sobrepasa los limites visibles del formulario Mdi o en dado caso los limites visibles del control MdiClient y tampoco estoy diciendo que esta sea la solución al problema, pero podria ser una opción.

    y removerlo tampoco creo ya que me imagino que al removerlo automaticamente podria dejar de ser un formulario Mdi, no lo probado pero lo puedes probar tu para salir de dudas...

    Salu2,


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    sábado, 22 de enero de 2011 4:14
    Moderador
  • Vos decís de escribir una subclase del mdiclient, digamos MiMDIClient para poder manipular los estilos en el WM_NCCREATE/WM_CREATE. Remover el mdiclient del mdiform, hacer un new de la clase MiMDIClient, y agregarla al mdiform.


    bueno, antes de ponerme a inventar busque en CodeProject y aqui esta un ejemplo de como hacer y esta lo que estaba mencionando.

    http://www.codeproject.com/KB/dialog/mdiclientcontroller.aspx

    Salu2,


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    sábado, 22 de enero de 2011 4:48
    Moderador
  • Vos decís de escribir una subclase del mdiclient, digamos MiMDIClient para poder manipular los estilos en el WM_NCCREATE/WM_CREATE. Remover el mdiclient del mdiform, hacer un new de la clase MiMDIClient, y agregarla al mdiform.


    para hacerlo funcionar, solo copia el archivo MdiClientController.cs a tu projecto, luego en el constructor del formulario principal cambialo a manera de que quede así:

        MdiClientController mdiClientController;
    
        public Principal()
        {
          mdiClientController = new MdiClientController(this);
          mdiClientController.AutoScroll = false;
          InitializeComponent();
        }
    
    

    si lo copias recuerda cambiar el Namespace de este archivo al namespace de tu projecto.

    Salu2,

     


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    sábado, 22 de enero de 2011 5:06
    Moderador
  • entiendo, C# es muy potente y como siempre digo con este lenguaje estas limitado a tu creatividad y no al Lenguaje de programación... pero!!!.. siempre hay un pero... en ocaciones he tenido que acudir a DLLs hechas en C++ para controlar algunas funciones a un nivel + bajo (kernel) con una funcionalidad + global... poreso ya resolvi aprender C/C++, ahora que me he introducido a C++ tengo una visión muy diferente de C#, una visión más orientada a las API (Win32)

    Salu2,


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    sábado, 22 de enero de 2011 17:00
    Moderador
  • intente probarlo pero marca error en esta linea:

    Application.Run(new Principal());

    Salu2,


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    sábado, 22 de enero de 2011 18:29
    Moderador