Jump to content

Duda VB.NET


Recommended Posts

Hola a todos.

Mi duda es la siguiente:

Estoy creando una aplicación en VB.NET, uso Visual Studio 2005 y tengo un formulario principal que abre formularios Hijos dentro de él (con MDI).

Lo que necesito, y no he podido hacer (y he buscado harto por la web) es crear un menú desplegable al estilo Visual Studio, como son: Explorador de soluciones, Cuadro de herramientas y propiedades, que pueden anclarse a los lados de la aplicación, cerrarse u ocultarse.

Espero me puedan ayudar, de antemano muchas gracias.

Link to comment
Share on other sites

Off Topic: En este minuto tengo internet más lento que un bolero, así q no voy a buscar la solución específica y tampoco tengo VS en este rato... mañana a ver si tengo tiempo para ayudarte mejor, pero por el momento voy a tratar de alumbrarte un poco...

 

Suponiendo que quieres implementar las 3 cosas (explorador de soluciones, propiedades y cuadro de herramientas)...

 

0. Para hacer esto, necesitas tener conocimientos medio-avanzado en VB.Net... por siaca.. :tonto:

1. Para cada una de las 3 cosas, necesitas crear un control de usuario (o control definido por el usuario). Uno para el explorador, otro para propiedades y otro para herramientas.

2. Estos controles los acoplas al formulario principal, con un control (que no me acuerdo cómo se llama ahora, pero creo que es algo como ToolStripblablabla...

3. Ahora viene lo pelúo... XD

- Cuadro de Herramientas: Para hacer esto, necesitas crear una clase que hereda de TreeView... Si te fijas, un TreeView tiene elementos que se ordenan en forma de árbol wow! :tonto: ... Para el caso del cuadro de herramientas es un TreeView de 2 niveles (un encabezado a contenedor y un detalle donde aparecen todos los controles). En la clase que heredas, principalmente lo que tienes que hacer es sobreescribir 2 Subs, que son OnDrawNode y OnMouseUp. El 1º se ejecuta cuando se dibuja cada uno de los nodos del TreeView, entonces, lo que tienes que hacer es no dibujar las rayitas, ni el + o -, pero sí el texto... Pero el texto, lo tienes que poner dentro de un rectángulo (que tienes que generar) y además, este rectángulo lo haces con gradiente para darle el efecto bonito... Esto en el caso sólo del primer nivel del menú (contenedor)... Para los ítems (controles del cuadro) tienes que hacer más o menos lo mismo, pero con otro efecto, por ejemplo, cuando pase el mouse por encima cambie el color de fondo... El 2º Sub es para sobreescribir qué va a hacer cuando se pinche un elemento... Esto es necesario porque como redibujaste los nodos, tiene un tratamiento medio especial...

Aquí te dejo un Sub que llamo en OnDrawNode y que dibuja el nodo (menú contenedor), para que te vayas haciendo la idea... :tonto:

Private Sub drawRootNode(ByVal e As DrawTreeNodeEventArgs)

        Dim loNodeTextRect As Rectangle = e.Bounds

        loNodeTextRect.Width -= 1
        loNodeTextRect.Height -= 1

        Dim lgBrush As New LinearGradientBrush(e.Bounds, Color.FromArgb(221, 220, 203), Color.FromArgb(196, 193, 176), LinearGradientMode.Vertical)

        e.Graphics.FillRectangle(lgBrush, loNodeTextRect)
        e.Graphics.DrawLine(New Pen(Me.BackColor), 0, loNodeTextRect.Bottom - 2, loNodeTextRect.Width, loNodeTextRect.Bottom - 2)
        'End If

        If Me.m_showMinusPlus Then
            e.Graphics.DrawImage(IIf(e.Node.IsExpanded, My.Resources.expanded, My.Resources.collapsed), New Point(loNodeTextRect.Left + 3, loNodeTextRect.Top + 4))
        End If

        loNodeTextRect.Offset(16, 0)

        e.Graphics.DrawString(e.Node.Text, Me.m_groupHeaderFont, SystemBrushes.ControlText, loNodeTextRect.Location)

    End Sub

- Para el Cuadro de Propiedades: Esto es más sencillo que lo anterior... Aquí, en el control de usuario que vas a crear, lo único que tienes que hacer es arrastrar un ComboBox y un DataGridView... Ambos los debes poner dentro de un Control Tab... No recuerdo bien, si el DataGridView tiene o no un DataGridViewColumn tipo texto + botón (como el que te aparece en una propiedad Font [el botoncito con los 3 puntitos])... en caso de no tenerlo, tendrías que hacer una clase que hereda de un DataGridViewTextBoxColumn y hacer más o menos lo mismo que para el TreeView... osea, OnDraw o como se llame el método, tienes que dibujar un TextBox y un botón, en vez de un solo TextBox, como lo hace el DataGridViewTextBoxColumn.

- Explorador de Soluciones: Bueno... esto también es fácil, lo mismo que las Propiedades... porque en el control de usuarios, lo único que tienes que hacer es arrastrar un Tab, dentro del tab un TreeView y llenar ese TreeView con los datos que necesites... Creo que no debería tener nada especial...

 

Bueno... mañana veo cómo se agregan controles de usuario personalizados a un MDI....

 

Ahhh!!!!

 

Y para el truquito que se expanda y quede sólamente la pestaña visible... Lo que puedes hacer es que en vez de control de usuario, tienes que hacer una clase que hereda del control Tab... En esta clase, lo principal, es que tienes que sobreescribir el método que se llama cuando se hace click en la pestaña... Ahí, tienes que validar si el control está colapsado o expandido y hacer la operación de agrandar o achicar... Aquí lo especial es que debes agregar esto en el constructor, para que no pestañee cuando se mueve...

        Me.SetStyle(ControlStyles.UserPaint, True)
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        Me.SetStyle(ControlStyles.ResizeRedraw, True)

 

Suerte!!!!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...