none
resaltar el control que tiene el foco RRS feed

  • Pregunta

  • Estoy tratando que el usuario tenga muy "claro y rapido" cual es el control que esta activo en cada momento para eso estoy usando el ENTER y LEAVE de los controles.

    En el ENTER le cambio el BackColor a Color.NavajoWhite.

    En el LEAVE según de que control se trate le vuelvo a colocar el color inicial.

    Con los TextBox y los Button todo de maravilla.

    Pero se me presenta el problema con: CheckBox (cuando no tiene texto) y el DateTimePicker

    Alguna sugerencia ?


    Hugo González (Macgyber)

    sábado, 16 de septiembre de 2017 13:12

Respuestas

  • Lo que podrías hacer para no complicar con personalizar los controles para adaptarlos a tu necesidad además de tener que estar cambiando las propiedades de los controles y además de que pueden ser muchos como pueden ser pocos y algo que llamaría la atención rápidamente del usuario seria mostrar un cuadro parpadeante alrededor del control que tenga el foco.

    Para este caso yo he creado un componente que además implementa la interfaces IExtenderProvider el cual le agregará a todos tus controles una nueva propiedad "Highlight when focus" tipo verdadero o falso, a los controles donde establezca está propiedad en true aparecerá un marco alrededor del control parpadeando, para muestra una imagen como el código del componente. (Perdón por la imagen si aparece muy grande pero la subí desde el celular)

    ProvideProperty("Highlight", typeof(Control))]
    
    public class HighlightControl : Component, IExtenderProvider {
    
     
    
    private bool onOff = true;
    
    private Timer timer = new Timer();
    
    private Control activeControl;
    
    private Hashtable highlightTable;
    
    private void OnHighlight(object sender, PaintEventArgs e) {
    
    Control ctrl = sender as Control;
    
    Rectangle rect = this.activeControl.Bounds;
    
    rect.Inflate(5, 5);
    
    this.onOff = !this.onOff;
    
    Color color = this.onOff ? Color.Red : Color.Transparent;
    
    using (Pen pen = new Pen(color, 3)) {
    
    // top left
    
    e.Graphics.DrawLine(pen, rect.Left + 1, rect.Top, rect.Left + 1, rect.Top + 8);
    
    e.Graphics.DrawLine(pen, rect.Left + 1, rect.Top + 1, rect.Left + 8, rect.Top + 1);
    
    // top right
    
    e.Graphics.DrawLine(pen, rect.Right, rect.Top + 1, rect.Right - 8, rect.Top + 1);
    
    e.Graphics.DrawLine(pen, rect.Right - 2, rect.Top, rect.Right - 2, rect.Top + 8);
    
    // bottom right
    
    e.Graphics.DrawLine(pen, rect.Right - 2, rect.Bottom, rect.Right - 2, rect.Bottom - 8);
    
    e.Graphics.DrawLine(pen, rect.Right - 2, rect.Bottom - 2, rect.Right - 8, rect.Bottom - 2);
    
    // bottom left
    
    e.Graphics.DrawLine(pen, rect.Left + 1, rect.Bottom, rect.Left + 1, rect.Bottom - 8);
    
    e.Graphics.DrawLine(pen, rect.Left + 1, rect.Bottom - 2, rect.Left + 8, rect.Bottom - 2);
    
    }
    
    }
    
     
    
    public HighlightControl() {
    
    this.highlightTable = new Hashtable();
    
    this.timer.Interval = 300;
    
    this.timer.Tick += new EventHandler(timer_Tick);
    
    }
    
     
    
    public bool CanExtend(object extendee) {
    
    if (extendee is Control)
    
    return true;
    
    return false;
    
    }
    
    [DisplayName("Highlight when focus")]
    
    [DefaultValue(false)]
    
    public bool GetHighlight(Control control) {
    
    if (this.highlightTable.ContainsKey(control))
    
    return (bool)this.highlightTable[control];
    
    return false;
    
    }
    
    public void SetHighlight(Control control, bool value) {
    
    if (!value) {
    
    this.highlightTable.Remove(control);
    
    control.Enter -= new EventHandler(control_Enter);
    
    control.Leave -= new EventHandler(control_Leave);
    
    } else {
    
    this.highlightTable[control] = value;
    
    control.Enter += new EventHandler(control_Enter);
    
    control.Leave += new EventHandler(control_Leave);
    
    }
    
    }
    
    private void control_Leave(object sender, EventArgs e) {
    
    this.activeControl.Parent.Paint -= new PaintEventHandler(this.OnHighlight);
    
    this.activeControl.Parent.Invalidate();
    
    this.activeControl = null;
    
    this.timer.Stop();
    
    this.onOff = false;
    
    }
    
    private void control_Enter(object sender, EventArgs e) {
    
    this.activeControl = sender as Control;
    
    this.activeControl.Parent.Paint += new PaintEventHandler(this.OnHighlight);
    
    this.activeControl.Parent.Invalidate();
    
    this.timer.Start();
    
    }
    
    private void timer_Tick(object sender, EventArgs e) {
    
    if (this.activeControl != null && this.activeControl.IsHandleCreated && this.activeControl.Site == null) {
    
      this.activeControl.Parent.Invalidate();
    
    }
    
    }
    
    }
    
     


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    • Propuesto como respuesta Juan MondragónModerator miércoles, 20 de septiembre de 2017 18:31
    • Marcado como respuesta macgyber jueves, 21 de septiembre de 2017 19:13
    miércoles, 20 de septiembre de 2017 16:31
    Moderador

Todas las respuestas

  • Buenas, 

    Para el datetimepicker,  puedes cambiarle el forecolor,  como tendrá algún valor por default, ese valor se verá afectado por el cambio y se verá claro. 

    Para el check,  si no tienes texto,  ni el back ni el fore te van a valer. Igual alguien te recomienda un checkbox "customizado" que permita cambiar el blanco de detrás,  o sino podrías crear tu tu propio control checkbox al que poder cambiarle el blanco del fondo. 

    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    sábado, 16 de septiembre de 2017 13:25
  • por ahora como no son muchos, principalmente en la configuración del programa, no he recurrido a un control customizado.

    hice unos paneles con 6 pixel más grande en el ancho y alto, por ejemplo para los checkbox de 15*15 los hice de 21*21, luego elegi el checkbox y el panel y los centre horizontal y verticalmente, luego mande para atras el panel

    el navajowhite que se ve muy bien en los button y en los textbox sin molestar la visualizacion del numero, casi que no se veia, por ahora les he puesto Red pero es muy chillon, con tiempo vere un color menos chillon.

    Estoy atento a otras opciones, gracias Jorge Turrado


    Hugo González (Macgyber)

    sábado, 16 de septiembre de 2017 13:59
  • Buenos días.

    Para personalizar el checkbox podrías fijarte en la siguiente respuesta How can I change the color of the check mark of a CheckBox? y ver si se adecua a lo que necesitas.

    Espero te sirva de ayuda.

    Saludos.

    sábado, 16 de septiembre de 2017 14:36
  • hola

    quizas vas a tener que evaluar hacer uso del evento Paint para poder dibujar el borde sobre el checkbox

    How to draw a custom border around a form or control?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 18 de septiembre de 2017 11:00
  • tiene errores el código, no conseguí que funcionara y no es lo que deseo

    Hugo González (Macgyber)

    lunes, 18 de septiembre de 2017 14:33
  • lo que quiero es que resalte el control cuando tenga el foco, que el usuario tenga muy claro que ese es el control activo

    Hugo González (Macgyber)

    lunes, 18 de septiembre de 2017 14:55
  • estoy haciendo un control de usuario para resolver este problema, aqui les expongo el código 

    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 amersoft
    {
        public partial class CtrlCheckBox : UserControl
        {
            public CtrlCheckBox()
            {
                InitializeComponent();
                panel1.Height = checkBox1.Height + 6;
                panel1.Width = checkBox1.Width + 6;
    
            }
    
            private void checkBox1_Enter(object sender, EventArgs e)
            {
                panel1.BackColor = Color.NavajoWhite;
            }
    
            private void checkBox1_Leave(object sender, EventArgs e)
            {
                panel1.BackColor = SystemColors.Window;
            }
    
            public ContentAlignment CheckAlign
            {
                get
                {
                    return checkBox1.CheckAlign;
                }
                set
                {
                    checkBox1.CheckAlign = value;
                }
            }
    
            public bool Checked
            {
                get
                {
                    return checkBox1.Checked;
                }
                set
                {
                    checkBox1.Checked = value;
                }
            }
    
            public bool UseVisualStyleBackColor
            {
                get
                {
                    return checkBox1.UseVisualStyleBackColor;
                }
                set
                {
                    checkBox1.UseVisualStyleBackColor = value;
                }
            }
    
            public EventHandler CheckedChanged
            {
                //get
                //{
                //    return ?;
                //}
                set
                {
                    checkBox1.CheckedChanged += value;
                }
            }
        }
    }

    este es el designer

    namespace amersoft
    {
        partial class CtrlCheckBox
        {
            /// <summary> 
            /// Variable del diseñador necesaria.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary> 
            /// Limpiar los recursos que se estén usando.
            /// </summary>
            /// <param name="disposing">true si los recursos administrados se deben desechar; false en caso contrario.</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 de este método con el editor de código.
            /// </summary>
            private void InitializeComponent()
            {
                this.checkBox1 = new System.Windows.Forms.CheckBox();
                this.panel1 = new System.Windows.Forms.Panel();
                this.panel1.SuspendLayout();
                this.SuspendLayout();
                // 
                // checkBox1
                // 
                this.checkBox1.AutoSize = true;
                this.checkBox1.CheckAlign = System.Drawing.ContentAlignment.MiddleCenter;
                this.checkBox1.Location = new System.Drawing.Point(3, 3);
                this.checkBox1.Name = "checkBox1";
                this.checkBox1.Size = new System.Drawing.Size(15, 14);
                this.checkBox1.TabIndex = 0;
                this.checkBox1.UseVisualStyleBackColor = true;
                this.checkBox1.Enter += new System.EventHandler(this.checkBox1_Enter);
                this.checkBox1.Leave += new System.EventHandler(this.checkBox1_Leave);
                // 
                // panel1
                // 
                this.panel1.Controls.Add(this.checkBox1);
                this.panel1.Location = new System.Drawing.Point(0, 0);
                this.panel1.Name = "panel1";
                this.panel1.Size = new System.Drawing.Size(21, 20);
                this.panel1.TabIndex = 1;
                // 
                // CtrlCheckBox
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.Controls.Add(this.panel1);
                this.Name = "CtrlCheckBox";
                this.Size = new System.Drawing.Size(21, 20);
                this.Enter += new System.EventHandler(this.checkBox1_Enter);
                this.Leave += new System.EventHandler(this.checkBox1_Leave);
                this.panel1.ResumeLayout(false);
                this.panel1.PerformLayout();
                this.ResumeLayout(false);
    
            }
    
            #endregion
    
            private System.Windows.Forms.CheckBox checkBox1;
            private System.Windows.Forms.Panel panel1;
        }
    }

    yo quiero que el CtrlCheckBox funcione como si fuera el control CheckBox 

    pero me encuentro con la dificultad de como traspasar el get del evento CheckedChanged

    el control CtrlCheckBox tiene dentro el control checkBox1

    tal vez exista un camino más facil para conseguir agregarle el panel por detrás al CheckBox


    Hugo González (Macgyber)

    lunes, 18 de septiembre de 2017 17:14
  • Buenas,

    porque heredas de UserControl?

    puedes heredar directamente de CheckBox, y asi tienes de base las mismas funcionalidades que tiene la clase CheckBox

    public partial class CtrlCheckBox : CheckBox

    Una vez que has heredado desde el checkbox, solo tienes que hacer lo que ibas a hacer para cambiar el fondo, pero olvidándote de todos los demás eventos y propiedades.

    Atte



    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    martes, 19 de septiembre de 2017 18:57
  • gracias Jorge Turrado

    eso lo probé, supuse que era así, pero me aparece el panel al lado y no debajo


    Hugo González (Macgyber)

    martes, 19 de septiembre de 2017 22:12
  • buenas, 

    he rebuscado por algunos proyectos antiguos, y he visto un control checkbox que esta "customizado" , realmente, cambia un poco la apariencia del control, pero tambien la actuacion con foco, pruebalo y nos comentas, igual te sirve de base para continuar:

     class MyCheckBox : CheckBox
        {
            public MyCheckBox()
            {
                
            }
          
            protected override void OnPaint(PaintEventArgs pevent)
            {
                base.OnPaint(pevent);
    
                pevent.Graphics.Clear(BackColor);
    
                using (SolidBrush brush = new SolidBrush(ForeColor))
                    pevent.Graphics.DrawString(Text, Font, brush, 27, 4);
    
                Point pt = new Point(4, 4);
                Rectangle rect = new Rectangle(pt, new Size(16, 16));
    
                pevent.Graphics.FillRectangle(Brushes.Beige, rect);
    
                if (Checked)
                {
                    using (SolidBrush brush = new SolidBrush(ForeColor))
                    using (Font wing = new Font("Wingdings", 12f))
                        pevent.Graphics.DrawString("ü", wing, brush, 1, 2);
                }
                pevent.Graphics.DrawRectangle(Pens.DarkSlateBlue, rect);
    
                Rectangle fRect = ClientRectangle;
    
                if (Focused)
                {
                    fRect.Inflate(-1, -1);
                    using (Pen pen = new Pen(Brushes.Gray) { DashStyle = DashStyle.Dot })
                        pevent.Graphics.DrawRectangle(pen, fRect);
                    pevent.Graphics.DrawRectangle(Pens.LightGreen, rect);
                }
            }
        }
    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    miércoles, 20 de septiembre de 2017 7:43
  • Lo que podrías hacer para no complicar con personalizar los controles para adaptarlos a tu necesidad además de tener que estar cambiando las propiedades de los controles y además de que pueden ser muchos como pueden ser pocos y algo que llamaría la atención rápidamente del usuario seria mostrar un cuadro parpadeante alrededor del control que tenga el foco.

    Para este caso yo he creado un componente que además implementa la interfaces IExtenderProvider el cual le agregará a todos tus controles una nueva propiedad "Highlight when focus" tipo verdadero o falso, a los controles donde establezca está propiedad en true aparecerá un marco alrededor del control parpadeando, para muestra una imagen como el código del componente. (Perdón por la imagen si aparece muy grande pero la subí desde el celular)

    ProvideProperty("Highlight", typeof(Control))]
    
    public class HighlightControl : Component, IExtenderProvider {
    
     
    
    private bool onOff = true;
    
    private Timer timer = new Timer();
    
    private Control activeControl;
    
    private Hashtable highlightTable;
    
    private void OnHighlight(object sender, PaintEventArgs e) {
    
    Control ctrl = sender as Control;
    
    Rectangle rect = this.activeControl.Bounds;
    
    rect.Inflate(5, 5);
    
    this.onOff = !this.onOff;
    
    Color color = this.onOff ? Color.Red : Color.Transparent;
    
    using (Pen pen = new Pen(color, 3)) {
    
    // top left
    
    e.Graphics.DrawLine(pen, rect.Left + 1, rect.Top, rect.Left + 1, rect.Top + 8);
    
    e.Graphics.DrawLine(pen, rect.Left + 1, rect.Top + 1, rect.Left + 8, rect.Top + 1);
    
    // top right
    
    e.Graphics.DrawLine(pen, rect.Right, rect.Top + 1, rect.Right - 8, rect.Top + 1);
    
    e.Graphics.DrawLine(pen, rect.Right - 2, rect.Top, rect.Right - 2, rect.Top + 8);
    
    // bottom right
    
    e.Graphics.DrawLine(pen, rect.Right - 2, rect.Bottom, rect.Right - 2, rect.Bottom - 8);
    
    e.Graphics.DrawLine(pen, rect.Right - 2, rect.Bottom - 2, rect.Right - 8, rect.Bottom - 2);
    
    // bottom left
    
    e.Graphics.DrawLine(pen, rect.Left + 1, rect.Bottom, rect.Left + 1, rect.Bottom - 8);
    
    e.Graphics.DrawLine(pen, rect.Left + 1, rect.Bottom - 2, rect.Left + 8, rect.Bottom - 2);
    
    }
    
    }
    
     
    
    public HighlightControl() {
    
    this.highlightTable = new Hashtable();
    
    this.timer.Interval = 300;
    
    this.timer.Tick += new EventHandler(timer_Tick);
    
    }
    
     
    
    public bool CanExtend(object extendee) {
    
    if (extendee is Control)
    
    return true;
    
    return false;
    
    }
    
    [DisplayName("Highlight when focus")]
    
    [DefaultValue(false)]
    
    public bool GetHighlight(Control control) {
    
    if (this.highlightTable.ContainsKey(control))
    
    return (bool)this.highlightTable[control];
    
    return false;
    
    }
    
    public void SetHighlight(Control control, bool value) {
    
    if (!value) {
    
    this.highlightTable.Remove(control);
    
    control.Enter -= new EventHandler(control_Enter);
    
    control.Leave -= new EventHandler(control_Leave);
    
    } else {
    
    this.highlightTable[control] = value;
    
    control.Enter += new EventHandler(control_Enter);
    
    control.Leave += new EventHandler(control_Leave);
    
    }
    
    }
    
    private void control_Leave(object sender, EventArgs e) {
    
    this.activeControl.Parent.Paint -= new PaintEventHandler(this.OnHighlight);
    
    this.activeControl.Parent.Invalidate();
    
    this.activeControl = null;
    
    this.timer.Stop();
    
    this.onOff = false;
    
    }
    
    private void control_Enter(object sender, EventArgs e) {
    
    this.activeControl = sender as Control;
    
    this.activeControl.Parent.Paint += new PaintEventHandler(this.OnHighlight);
    
    this.activeControl.Parent.Invalidate();
    
    this.timer.Start();
    
    }
    
    private void timer_Tick(object sender, EventArgs e) {
    
    if (this.activeControl != null && this.activeControl.IsHandleCreated && this.activeControl.Site == null) {
    
      this.activeControl.Parent.Invalidate();
    
    }
    
    }
    
    }
    
     


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    • Propuesto como respuesta Juan MondragónModerator miércoles, 20 de septiembre de 2017 18:31
    • Marcado como respuesta macgyber jueves, 21 de septiembre de 2017 19:13
    miércoles, 20 de septiembre de 2017 16:31
    Moderador
  • Marvin E. Pineda si, esto es lo que estoy buscando

    gracias.

    disculpa mi ignorancia, pero como lo implemento ? como hago que todos los controles tengan esta propiedad ? incluso los que vienen con c#?


    Hugo González (Macgyber)

    miércoles, 20 de septiembre de 2017 21:57
  • Create una clase con el nombre HighlightControl.cs y copia y pega el código que antes publiqué, compilas el projecto, abres el formulario donde lo quieres usar y en la barra de controles debería aparecerte el componente que acabas de crear, lo arrastras hacia el formulario y listo ya te aparecerá la nueva propiedad que antes mencioné.

    Creo que tendrás que agregar algunos using según te marquen error al pegar.

    Cualquier cosa me avisas.


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 21 de septiembre de 2017 2:02
    Moderador
  • Eso ya lo probé, me faltaba el using System.Collections

    pero no me aparece la propiedad en los controles, compile y nada

    me aparecen varios métodos que no son referenciados:

    CanExtend()

    GetHighlight()

    SetHighlight()


    Hugo González (Macgyber)

    jueves, 21 de septiembre de 2017 3:05
  • veamos con imagenes

    • Crear clase con nombre "HighlightContro.cs" y compilar

    • Abrir formulario donde se usara el componente.

    y listo.... ejecutas tu aplicación.

    si aun así no te funciona te paso un projecto...

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 21 de septiembre de 2017 3:38
    Moderador
  • hice todo eso pero no me aparece esa propiedad, pasame el proyecto

    americasoftware@gmail.com


    Hugo González (Macgyber)

    jueves, 21 de septiembre de 2017 3:53
  • HighlightControl 

    descargalo y me avisas, VS2010


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 21 de septiembre de 2017 4:03
    Moderador
  • Yo lo probé en vs2008 y funcionó. 2 cosas a tener en cuenta:

    La Clase debe ser publica (creo), por defecto vs te la crea privada. Hay que agregar las herencias.

    public class HighlightControl: Component, IExtenderProvider
    {
    ....
    }

    jueves, 21 de septiembre de 2017 11:50
  • Si notas el código y las imágenes que publique la clase es pública y si cuando creas una clase por default está es privada y sin heredar de ningún otro componente, clase o control...

    Salu2


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 21 de septiembre de 2017 12:17
    Moderador
  • Yo creo que el problema por el cual no le está funcionando a mcgyber es porque no le está colocando el atributo a la clase por eso no aparece la propiedad en los controles...

    [ProvideProperty("Highlight", typeof(Control))]


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 21 de septiembre de 2017 12:48
    Moderador
  • AntiWork: no es eso, es pública

    Marvin E. Pineda: tome la clase del proyecto que pusiste y no veo las propiedades en ninguno de los controles de mi proyecto original, pero en el tuyo todo bien.

    Tengo otro proyecto y allí si funciono.

    Yo tengo UserControl, pero agregue en el proyecto que subiste un usercontrol, luego le agregue todo tipo de controles, le puse el HighlightControl.cs

    me aparecio la propiedad en todos los controles y funciona perfecto.

    probe de agregar un formulario en el proyecto (en que tengo el problema)

    con un control y no me aparece la propiedad

    conclusion tengo algo en mi proyecto que impide que la propiedad se visualice

    el framework en el tuyo es 3.5, en los mios en el que funciona y en el que no es 4.5.2

    en mi program.cs (en que tengo el problema) este es el contenido

    Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.ThreadException +=
                    new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(Application_ThreadException);
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);            
                System.Globalization.CultureInfo r = new System.Globalization.CultureInfo("es-ES"); //  ("en-US")
                r.NumberFormat.CurrencyDecimalSeparator = ".";
                r.NumberFormat.NumberDecimalSeparator = ".";
                System.Threading.Thread.CurrentThread.CurrentCulture = r;
                FormRemateDesdeExcel frde = new FormRemateDesdeExcel();
                frde.ShowDialog();
                if (frde.DialogResult == DialogResult.Cancel)
                {
                    Application.Exit();
                }

    no tengo advertencias ni errores 

    tome uno de los UserControls en que no me aparece la propiedad y lo copie a otro proyecto y alli si veo la propiedad

    evidentemente hay algo en mi proyecto que impide ver la propiedad

    alguna idea de que puede ser ?


    Hugo González (Macgyber)

    jueves, 21 de septiembre de 2017 13:17
  • Marvin E. Pineda: le estoy poniendo el atributo.

    Además uso el mismo archivo HighlightControl.cs en 2 proyectos y en uno funciona y en el otro no.

    La diferencia es el program.cs, abajo te puse el código del que no funciona.


    Hugo González (Macgyber)


    • Editado macgyber jueves, 21 de septiembre de 2017 13:23
    jueves, 21 de septiembre de 2017 13:22
  • La versión del framework no debería ser problema, pero si pudieras pasarme el proyecto donde no funciona para revisar que puede ser sería mejor.

    Salu2


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 21 de septiembre de 2017 13:36
    Moderador
  • Lo que citas de tu program.cs solo aplicará al ejecutar la app, lo acabo de probar con la misma versión de framework y funciona bien como ya has probado tu también y también coloque lo mismo en el program.cs y funciona bien.

    Ahora! Si estás utilizando controles de terceros y si ellos tienen alguna clase llamada Control pueda que entre en conflicto con la clase Control nativa del framework así que sugiero que en el atributo de la clase agregues toda la referencia ejemplo

    [ProvideProperty("Highlight", typeof(System.Windows.Forms.Control))]

    Creo que mencionaste usas controles de terceros


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 21 de septiembre de 2017 14:23
    Moderador
  • BINGOOOOOOOOO !!!!!

    EUREKAAAAAAAAAAAAA !!!!!

    Tenía un UserControl llamado CONTROL

    En un momento estuve a punto de cambiarle el nombre por: INFORMES pues son Informes que permiten Controlar el funcionamiento del programa y de la empresa.

    Es ahi donde se mareaba, aunque no me daba ningún error ni advertencia el VS.

    Estaba preparando un nuevo proyecto con lo minimo para probar que pasaba y pasartelo y empecé copiando el Form Inicial y uno de los UserControl, ahi me aparecieron errores y uno que no aparecia como error era:

    Control control1 = new Control();

    y yo no habia copiado Control.cs entonces me llamo la atención y ahi me di cuenta que ese podria ser el error.

    UNA MAS (Hice la consulta en otra pregunta pero nadie respondio):

    Tengo un ProyectoBase donde pongo todos los: UserControl, Forms, ...

    Dentro de dicho proyecto puedo usar los UserControl en los Forms.

    En los otros Proyectos yo referencio el ProyectoBase, esto me permite usar los Forms, pero los UserControl no me aparecen en las herramientas.

    Para todo uso el mismo namespace.

    Tienes idea de que es lo que me esta faltando para que HighlightControl me aparezca entre las herramientas ?


    Hugo González (Macgyber)

    jueves, 21 de septiembre de 2017 14:55
  • Buenas,

    Cuando creas un control Custom, simplemente con que lo compiles, Visual Studio debería ser capaz de encontrarlo y añadirlo a la sección Componentes XYXYXYXY en la parte superior de la barra de herramientas.

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    jueves, 21 de septiembre de 2017 15:00
  • Si lo tengo en el mismo proyecto, funciona de esa forma.

    Pero si esta en una DLL referenciada como hago para que aparezca ?


    Hugo González (Macgyber)

    jueves, 21 de septiembre de 2017 15:20
  • No, no aparecerán, para eso se crea un template y se agrega, hay ejemplos de como hacerlo solo que me dejes buscar el que yo use para mis controles y pasartelo

    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 21 de septiembre de 2017 15:27
    Moderador
  • Buenas, 

    si es un control en una DLL, hay que añadirlo manualmente a la barra de herramientas, para ello, cuando te muestra cosas, haces:

    1. Click derecho
    2. Seleccionas "Elegir elemtnos"
    3. Buscas tu DLL
    4. Añades el control o controles que quieras de la DLL

    No tiene mucho misterio, si necesitas imagenes porque no te aclaras comentame.

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    jueves, 21 de septiembre de 2017 15:35
  • Se usan templates cuando se crean controles y componentes de terceros para ser distribuidos y se agreguen a través de un instalador.

    Pero si son controles que sólo tus proyectos usarán puedes agregar el proyecto a la solución para menos complicación o agregarlo manualmente como menciona Jorge, pero si insiste en aprender como hacer un instalador de tus controles busca sobre EnvDTE y EnvDTE80


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 21 de septiembre de 2017 15:57
    Moderador
  • Hola Marvin E. Pineda podrias contactarme por correo: americasoftware@gmail.com quisiera conversar sobre el control HighLightControl.cs

    Hugo González (Macgyber)

    viernes, 29 de septiembre de 2017 22:40
  • Hola! Puedes hacerlo por el foro ya que para eso es... Si es algo referente al control subelo a la nube, compartes el Link en la pregunta y así otros participantes lo podrían descargar, revisar y dar sus mejoras o correcciones

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    viernes, 29 de septiembre de 2017 23:21
    Moderador
  • ASControl
    ADatoAtributo
    Picture string
    TipoAtributo enum
    Requerido         bool
            HighLight bool   

    Quisiera hacer una propiedad similar a:

    Font que dentro tiene otras propiedades

    de esa forma MIS propiedades quedarían dentro de ASControl y no desparramadas y entreveradas entre otras propiedades.

    He tratado de entender el funcionamiento de tu HighLightControl.cs y de a poco lo voy entendiendo.

    voy googleando y ya entendi la relacion entre ProvideProperty y el Get<name> y el Set<name>

    quisiera crear una clase ASControl que incluyera ADatoAtributo y esta tuviera dentro las propiedades mediante las cuales gobierno el funcionamiento del control.



    Hugo González (Macgyber)

    viernes, 29 de septiembre de 2017 23:46
  • Bien es cierto que la interface IExtenderProvider sirve para extender propiedades y funcionalidad de los controles, pero todo tiene un límite, si las propiedades que quieres modificar a tus controles repercuten en la apariencia de estos se vería hasta ser ejecutados o no tendría la misma repercusión a diferencia de ser tratados directamente en el control.

    Pero! Podría tenes sus limitaciones, pero creo que se podria!.. pero no sería únicamente usando la interface antes menciona, habría que buscar algo que apoye está interface..


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    sábado, 30 de septiembre de 2017 0:18
    Moderador
  • Cuando empecé quería hacer que el ingreso de números fuera inteligente como en las calculadoras, probé con MaskedTextBox pero no conseguí lo que deseaba, asi que me cree unos controles: numéricos, texto, ...

    Observé en tu Blog que en tu control TextEditor utilizas un enumerado MaskType creo que con una idea similar.

    Yo me apoyo en cosas más antiguas, que existían en otros lenguajes (cobol, clipper) el Picture, pensé que el MaskedTextBox era lo similar, pero no pude.

    a que le llamo ingreso de números inteligente:

    con una picture "9999.99" (4 enteros y 2 decimales)

    si escribes -.50 -> -0.50 <enter> si estaba definido con 2 decimales

    -.5<enter> -> -0.50 <enter>

    1.2<enter> -> 1.20 <enter>

    0 <enter> -> 0.00<enter>

    que no permita más de 4 digitos enteros ni 2 decimales

    y muchas otras opciones por ejemplo que al entrar esté todo seleccionado por si quieres sustituirlo

    si buscas en google : clipper picture veras todas las opciones que tenian y como ACOTABA el ingreso de datos, evitando el ingreso de errores

    además el picture de arriba no permite el ingreso de letras y solo admite numeros, signo de menos y . decimal (el signo de + se asume)


    Hugo González (Macgyber)

    sábado, 30 de septiembre de 2017 0:48
  • Entiendo, yo vengo de FoxPro, Visual FoxPro... así que se de lo que hablas, pero habría que probar sin abusar, se que tendremos limitancias.. pero solo en el camino lo sabremos, solo déjame terminar con otra pregunta del foro y veo en que te puedo ayudar

    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    sábado, 30 de septiembre de 2017 1:06
    Moderador
  • como hariamos para abrir otro hilo y seguir tratando el tema de agregar propiedades a los controles ?

    como hago para mencionar a otro usuario ? a Marvin E. Pineda en este caso

    existe algun @ o $ delante del nombre ?


    Hugo González (Macgyber)

    lunes, 2 de octubre de 2017 22:12