CLR: .Net / Mono / Boo / Otros CLR > C#
Código Barra de Información estilo Windows 7
(1/1)
Jeysscarr:
Hola a todos, muy buenas tardes
Actualmente he creado un prototipo de barra de información basada en la forma de la barra de descripción que se usa en Windows 7, ese panel que muestra la informaciíon de los archivos o carpetas que seleccionamos.
La he creado con la finalidad de mostrar datos caracteristicos de elementos que el usuario seleccione en mis aplicaciones y datos estadisticos para varios elementos... he agregado la funcionalidad de adaptarse al tamaño de los elementos informativos que se le agreguen, es decir, si en modo de ejecución se le pasan parametros para nuevos valores, este cambia la posición de los controles para ahorrar espacio o mostrar la información completa.
Hasta el momento he logrado mi objetivo, y me gusta mucho como se ve en funcionamiento ya que para mostrar las propiedades de un objeto no necesito crear controles especificos para cada uno.
En Fin.. lo que quisiera es que opinaran acerca de que debería agregar para que cuando el usuario Agrande o haga mas pequeño el control, los Labels que ya estan agregados se adapten al nuevo tamaño como en windows 7, en donde uno agranda la barra y los elementos que estaban en una columna se pasan para la primera para no dejar espacios vacios, etc.
A continuación mi código de la clase y un ejemplo de como lo uso
1. Clase LABEL_ (Extendida de Label)
--- Código: C# ---using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms; namespace ControlBarraDescripcion{ public class Label_:Label { int col=0; public int Columna { get { return col; } set { col = value; } } bool ed = false; public bool esDescripcion { get { return ed; } set { ed = value; } } string desc = null; public string Descripcion { get { return desc; } set { desc = value; } } public bool CorrespondeDescripcion(string descrip) { if (Descripcion == null) { return false; } else { if (Descripcion == descrip) { return true; } else { return false; } } } }}
2. Control Barra Información
--- Código: C# ---using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Data;using System.Linq;using System.Text;using System.Windows.Forms; namespace ControlBarraDescripcion{ public partial class BarraInformacion : UserControl { public class InfoColumna { public int Index = 0; public Label_ LabelDescripcionMasAncho = null; public Label_ LabelValorMasAncho = null; public InfoColumna(Label_ Ldesc, Label_ LValor) { LabelDescripcionMasAncho = Ldesc; LabelValorMasAncho = LValor; } } public List<InfoColumna> ListaColumnas = new List<InfoColumna>(); public BarraInformacion() { InitializeComponent(); } public int posY = 0; public int posX = 0; public int cols = 0; public int mayorAncho = 0; public Label_ LabelDescripcionMasAncho = null; public Label_ ultimoLabel = null; public int cont = 0; public bool NuevaColumnaVacia = false; public Color ColorDescripcion=Color.DimGray; public Color ColorValor = Color.Black; ImageList iml=null; public ImageList Imagenes { get { return iml; } set { iml = value; } } public void Iniciar(Color ColorDescripcion, Color ColorValor, string titulo, int imageindex) { panel1.Controls.Clear(); this.ColorDescripcion = ColorDescripcion; this.ColorValor = ColorValor; posX = 0; posY = 0; cols = 0; mayorAncho = 0; ListaColumnas.Clear(); LbTITULO.Text = titulo; Pct.Image = null; ultimoLabel = null; NuevaColumnaVacia = false; LabelDescripcionMasAncho = null; cont = 0; if (Imagenes != null) { if (imageindex != -1) { Pct.Image = Imagenes.Images[imageindex]; } else Pct.Image = null; } } public void AgregarDescripcion(string descripcion, string valor,bool CrearNuevosControles) { if (CrearNuevosControles) { if (ultimoLabel == null) { //es el primero Label_ Ldescripcion = new Label_(); panel1.Controls.Add(Ldescripcion); Ldescripcion.Tag = cont; cont++; Ldescripcion.AutoSize = true; //Ldescripcion.BorderStyle = BorderStyle.FixedSingle; Ldescripcion.Text = descripcion + ":"; Ldescripcion.esDescripcion = true; Ldescripcion.Location = new Point(posX, posY); Ldescripcion.Visible = true; Ldescripcion.Columna = cols; Ldescripcion.ForeColor = ColorDescripcion; posY = Ldescripcion.Bounds.Bottom + 4; ultimoLabel = Ldescripcion; //Label_ del valor Label_ Lvalor = new Label_(); panel1.Controls.Add(Lvalor); Lvalor.Tag = cont; Lvalor.Descripcion = descripcion; cont++; Lvalor.AutoSize = true; //Lvalor.BorderStyle = BorderStyle.FixedSingle; Lvalor.Text = valor; Lvalor.Location = new Point(Ldescripcion.Right, Ldescripcion.Bounds.Y); Lvalor.Visible = true; Lvalor.Columna = cols; Lvalor.ForeColor = ColorValor; ListaColumnas.Add(new InfoColumna(Ldescripcion, Lvalor)); } else { Label_ Ldescripcion = new Label_(); panel1.Controls.Add(Ldescripcion); Ldescripcion.Tag = cont; cont++; Ldescripcion.AutoSize = true; //Ldescripcion.BorderStyle = BorderStyle.FixedSingle; Ldescripcion.Text = descripcion + ":"; Ldescripcion.esDescripcion = true; Ldescripcion.Location = new Point(posX, posY); Ldescripcion.Visible = true; Ldescripcion.Columna = cols; Ldescripcion.ForeColor = ColorDescripcion; posY = Ldescripcion.Bounds.Bottom + 4; ultimoLabel = Ldescripcion; //Label_ del valor Label_ Lvalor = new Label_(); panel1.Controls.Add(Lvalor); Lvalor.Tag = cont; Lvalor.Descripcion = descripcion; cont++; Lvalor.AutoSize = true; //Lvalor.BorderStyle = BorderStyle.FixedSingle; Lvalor.Text = valor; Lvalor.Location = new Point(Ldescripcion.Right, Ldescripcion.Bounds.Y); Lvalor.Visible = true; Lvalor.Columna = cols; Lvalor.ForeColor = ColorValor; if (NuevaColumnaVacia == true) { ListaColumnas.Add(new InfoColumna(Ldescripcion, Lvalor)); NuevaColumnaVacia = false; } if (Lvalor.Width > ListaColumnas[cols].LabelValorMasAncho.Width) { ListaColumnas[cols].LabelValorMasAncho = Lvalor; } //determinar si el ancho de este Label_ es mayor que el de los demás if (Ldescripcion.Size.Width > ListaColumnas[cols].LabelDescripcionMasAncho.Width) { ListaColumnas[cols].LabelDescripcionMasAncho = Ldescripcion; //alinear los Labels de arriba a la derecha de este control foreach (Label_ lb in panel1.Controls) { if (lb.esDescripcion == true && (int)lb.Columna == cols) { lb.Left = ListaColumnas[cols].LabelDescripcionMasAncho.Right - lb.Width; } else if (lb.esDescripcion == false && (int)lb.Columna == cols) { lb.Left = ListaColumnas[cols].LabelDescripcionMasAncho.Right; } } } else { Ldescripcion.Left = ListaColumnas[cols].LabelDescripcionMasAncho.Right - Ldescripcion.Width; Lvalor.Left = Ldescripcion.Right + 2; } if (panel1.Height - ultimoLabel.Bottom < 16) { //crear una nueva columna posX = ListaColumnas[cols].LabelValorMasAncho.Right + 2; posY = 0; NuevaColumnaVacia = true; cols++; } } } else { foreach (Label_ Lb in panel1.Controls) { if (Lb.CorrespondeDescripcion(descripcion)) { Lb.Text = valor; break; } } } } public void ReordenarItems() { if (cont > 0) { List<Label_> Lista = new List<Label_>(); foreach(Label_ Lb in panel1.Controls) { Lista.Add(Lb); } int mayorAnchoD = 0, mayorAnchoV = 0; Label_ lbVal = null; Label_ lbDesc = null; int xDesc = 0, xVal=0; for (int i = 0; i <= cols; i++) { mayorAnchoD = 0; mayorAnchoV = 0; var consulta = from item in Lista where item.Columna == i && item.esDescripcion ==true select item; foreach (Label_ it in consulta) { if (it.Width > mayorAnchoD) { mayorAnchoD = it.Width; lbDesc = it; } } var consulta2 = from item in Lista where item.Columna == i && item.esDescripcion == false select item; foreach (Label_ it in consulta2) { if (it.Width > mayorAnchoV) { mayorAnchoV = it.Width; lbVal = it; } } foreach (Label_ it in consulta) { it.Location = new Point(xDesc + (mayorAnchoD - it.Width), it.Location.Y); } foreach (Label_ it in consulta2) { it.Location = new Point(lbDesc.Right + 2, it.Location.Y); } xDesc = lbVal.Right + 2; } } } }}
3. El Designer del control anterior
--- Código: C# ---namespace ControlBarraDescripcion{ partial class BarraInformacion { /// <summary> /// Variable del diseñador requerida. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Limpiar los recursos que se estén utilizando. /// </summary> /// <param name="disposing">true si los recursos administrados se deben eliminar; false en caso contrario, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Código generado por el Diseñador de componentes /// <summary> /// Método necesario para admitir el Diseñador. No se puede modificar /// el contenido del método con el editor de código. /// </summary> private void InitializeComponent() { this.Pct = new System.Windows.Forms.PictureBox(); this.LbTITULO = new System.Windows.Forms.Label(); this.panel1 = new System.Windows.Forms.Panel(); ((System.ComponentModel.ISupportInitialize)(this.Pct)).BeginInit(); this.SuspendLayout(); // // Pct // this.Pct.Location = new System.Drawing.Point(3, 25); this.Pct.Name = "Pct"; this.Pct.Size = new System.Drawing.Size(97, 110); this.Pct.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.Pct.TabIndex = 0; this.Pct.TabStop = false; // // LbTITULO // this.LbTITULO.AutoSize = true; this.LbTITULO.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold); this.LbTITULO.Location = new System.Drawing.Point(3, 6); this.LbTITULO.Name = "LbTITULO"; this.LbTITULO.Size = new System.Drawing.Size(113, 13); this.LbTITULO.TabIndex = 1; this.LbTITULO.Text = "Prueba con control"; // // panel1 // this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panel1.Location = new System.Drawing.Point(106, 25); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(518, 110); this.panel1.TabIndex = 2; // // BarraInformacion // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.panel1); this.Controls.Add(this.LbTITULO); this.Controls.Add(this.Pct); this.Font = new System.Drawing.Font("Tahoma", 8.25F); this.Name = "BarraInformacion"; this.Size = new System.Drawing.Size(627, 138); ((System.ComponentModel.ISupportInitialize)(this.Pct)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.PictureBox Pct; private System.Windows.Forms.Panel panel1; public System.Windows.Forms.Label LbTITULO; }}
4. Ejemplo de su Utilización
--- Código: C# --- private void Trv_SelectedIndexChanged(object sender, EventArgs e) { if (Trv.SelectedItems.Count == 1) { if (VariosSeleccionados) { CrearNuevasDescripciones = true; VariosSeleccionados = false; } else { CrearNuevasDescripciones = false; } ListviewItemEstudiante item = (ListviewItemEstudiante)Trv.SelectedItems[0]; //determinar la mayor edad Single mayor = 0; for (int i = 1; i <= (Trv.Columns.Count - 2); i++) { Single valor = 0; if (Trv.SelectedItems[0].SubItems[i].Text != "") { valor = Single.Parse(Trv.SelectedItems[0].SubItems[i].Text); if (valor > mayor) { mayor = valor; } } } if (CrearNuevasDescripciones) { barraInformacion1.Iniciar(Color.DimGray, Color.Black, "Actualmente usted ha seleccionado al estudiante: " + item.NombreCompleto.ToUpper(), -1); } barraInformacion1.LbTITULO.Text = "Actualmente usted ha seleccionado al estudiante: " + item.NombreCompleto.ToUpper(); barraInformacion1.AgregarDescripcion("ID", item.IDEstudiante.ToString("00000"), CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Promedio", Trv.SelectedItems[0].SubItems[Trv.Columns.Count - 1].Text, CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Tipo de documento", item.TipoDocumento, CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Documento de Identidad", item.Documento, CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Fecha de Nacimiento", item.FechaNacimiento.ToLongDateString(), CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Ciudad Natal", item.CiudadNacimiento, CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("edad", item.Edad + " años", CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Mayor Calificación", mayor.ToString() + " pts", CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Sexo", item.Sexo, CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Estado", item.Estado, CrearNuevasDescripciones); if (!CrearNuevasDescripciones) { barraInformacion1.ReordenarItems(); } } else if (Trv.SelectedItems.Count > 1) { if (!VariosSeleccionados) { barraInformacion1.Iniciar(Color.DimGray, Color.Black, "Elementos Selccionados", -1); VariosSeleccionados = true; CrearNuevasDescripciones = true; } else { CrearNuevasDescripciones = false; } int mayorEdad = 0, menorEdad = 0, acumEdad = 0; Single promedio = 0, mayorPromedio = 0; ListviewItemEstudiante itMayor = null; ListviewItemEstudiante itMenor = null; ListviewItemEstudiante itMayorPromedio = null; int EstaEnLaPrimeraPosicion = 1; foreach (ListviewItemEstudiante item in Trv.SelectedItems) { if (EstaEnLaPrimeraPosicion == 1) { menorEdad = item.Edad; itMenor = item; itMayorPromedio = item; EstaEnLaPrimeraPosicion = 0; } if (item.promedio > mayorPromedio) { mayorPromedio = item.promedio; itMayorPromedio = item; } if (item.Edad > mayorEdad) { mayorEdad = item.Edad; itMayor = item; } if (item.Edad < menorEdad) { menorEdad = item.Edad; itMenor = item; } acumEdad += item.Edad; } promedio = acumEdad / Trv.SelectedItems.Count; barraInformacion1.AgregarDescripcion("Seleccion", Trv.SelectedItems.Count.ToString(), CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Mayor edad", itMayor.NombreCompleto + ", " + mayorEdad + " años", CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Menor edad", itMenor.NombreCompleto + ", " + menorEdad + " años", CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Promedio de edad", promedio.ToString() + " años", CrearNuevasDescripciones); barraInformacion1.AgregarDescripcion("Mejor promedio", itMayorPromedio.NombreCompleto + ", con " + mayorPromedio.ToString("0.00") + " pts", CrearNuevasDescripciones); if (!CrearNuevasDescripciones) { barraInformacion1.ReordenarItems(); } } }
y unas imágenes de como se ve en modo de ejecución
cachorro:
Q tal jeysscarr muy interesante tu trabajo...me pregunto si pudieras subir todo el proyecto para poder checarlo ya que me parecio interesante....
Navegación
Ir a la versión completa