Controle tabControl personalizado, CSharp, Microsoft Visual Studio 2022
17/11/2023
0
Esta classe cria um controle personalizado SFTabControl que herda do controle TabControl, Estou utilizando o Microsoft Visual Studio 2022
Problema: Quando vou adicionar outros controles na tabpage em tempo de design os mesmos ao ser desenhados ficam escondidos. Como posso resolver este problema?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GUI.SFControls
{
public enum TabPosition
{
Superior,
Inferior,
Esquerda,
Direita
}
public class SFTabControl : TabControl
{
private TabPosition tabPosition = TabPosition.Superior;
#region Properties
[Category("SisFlex")]
[Description("Cor de fundo das abas.")]
public Color TabBackColor { get; set; } = Color.LavenderBlush;
[Category("SisFlex")]
[Description("Cor da borda das abas.")]
public Color TabBorderColor { get; set; } = Color.MediumSlateBlue;
[Category("SisFlex")]
[Description("Largura da borda das abas.")]
public int TabBorderWidth { get; set; } = 1;
[Category("SisFlex")]
[Description("Fonte das abas.")]
public Font TabFont { get; set; } = new Font("Century Gothic", 10f);
[Category("SisFlex")]
[Description("Cor da borda do controle SFTabControl.")]
public Color SFTabControlBorderColor { get; set; } = Color.Transparent;
[Category("SisFlex")]
[Description("Largura da borda do controle SFTabControl.")]
public int ControlBorderWidth { get; set; } = 0;
[Category("SisFlex")]
[Description("Cor da borda da TabPage.")]
public Color TabPageBorderColor { get; set; } = Color.MediumSlateBlue;
[Category("SisFlex")]
[Description("Largura da borda da TabPage.")]
public int TabPageBorderWidth { get; set; } = 1;
#endregion
#region Constructors
public SFTabControl()
{
this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
this.SizeMode = TabSizeMode.Fixed;
this.ItemSize = new Size(100, 30);
}
#endregion
#region Methods
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
using (SolidBrush backBrush = new SolidBrush(TabBackColor))
using (Pen borderPen = new Pen(TabBorderColor, TabBorderWidth))
using (Pen tabPageBorderPen = new Pen(TabPageBorderColor, TabPageBorderWidth))
{
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
for (int i = 0; i < TabPages.Count; i++)
{
Rectangle tabRect = GetTabRect(i);
bool isSelected = i == this.SelectedIndex;
tabRect.Inflate(new Size(-TabBorderWidth, -TabBorderWidth));
// Altera a cor de fundo e a cor da fonte da aba selecionada
Color tabBack = isSelected ? Color.LightSkyBlue : TabBackColor;
Color tabFontColor = isSelected ? Color.White : Color.Black;
using (SolidBrush tabBackBrush = new SolidBrush(tabBack))
using (SolidBrush tabFontBrush = new SolidBrush(tabFontColor))
{
e.Graphics.FillRectangle(tabBackBrush, tabRect);
e.Graphics.DrawRectangle(borderPen, tabRect);
e.Graphics.DrawString(TabPages[i].Text, TabFont, tabFontBrush, tabRect, stringFormat);
}
RectangleF tabPageContentRect = GetTabRect(i);
tabPageContentRect.Y += tabRect.Height;
tabPageContentRect.Height -= tabRect.Height;
// Calcula o retângulo para o conteúdo da TabPage (excluindo a área da aba)
RectangleF tabPageRect = new RectangleF(
tabPageContentRect.X + 2, tabPageContentRect.Y + 2,
tabPageContentRect.Width - 4, tabPageContentRect.Height - 4);
// Desenha um retângulo em volta da página das abas
int alturaTab = this.ItemSize.Height;
e.Graphics.DrawRectangle(tabPageBorderPen, new Rectangle(1, alturaTab + 1, Width - 3, Height - alturaTab - 3));
}
}
using (Pen controlBorderPen = new Pen(SFTabControlBorderColor, ControlBorderWidth))
{
e.Graphics.DrawRectangle(controlBorderPen, new Rectangle(0, 0, Width - 1, Height - 1));
}
}
#endregion
}
}
Problema: Quando vou adicionar outros controles na tabpage em tempo de design os mesmos ao ser desenhados ficam escondidos. Como posso resolver este problema?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GUI.SFControls
{
public enum TabPosition
{
Superior,
Inferior,
Esquerda,
Direita
}
public class SFTabControl : TabControl
{
private TabPosition tabPosition = TabPosition.Superior;
#region Properties
[Category("SisFlex")]
[Description("Cor de fundo das abas.")]
public Color TabBackColor { get; set; } = Color.LavenderBlush;
[Category("SisFlex")]
[Description("Cor da borda das abas.")]
public Color TabBorderColor { get; set; } = Color.MediumSlateBlue;
[Category("SisFlex")]
[Description("Largura da borda das abas.")]
public int TabBorderWidth { get; set; } = 1;
[Category("SisFlex")]
[Description("Fonte das abas.")]
public Font TabFont { get; set; } = new Font("Century Gothic", 10f);
[Category("SisFlex")]
[Description("Cor da borda do controle SFTabControl.")]
public Color SFTabControlBorderColor { get; set; } = Color.Transparent;
[Category("SisFlex")]
[Description("Largura da borda do controle SFTabControl.")]
public int ControlBorderWidth { get; set; } = 0;
[Category("SisFlex")]
[Description("Cor da borda da TabPage.")]
public Color TabPageBorderColor { get; set; } = Color.MediumSlateBlue;
[Category("SisFlex")]
[Description("Largura da borda da TabPage.")]
public int TabPageBorderWidth { get; set; } = 1;
#endregion
#region Constructors
public SFTabControl()
{
this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
this.SizeMode = TabSizeMode.Fixed;
this.ItemSize = new Size(100, 30);
}
#endregion
#region Methods
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
using (SolidBrush backBrush = new SolidBrush(TabBackColor))
using (Pen borderPen = new Pen(TabBorderColor, TabBorderWidth))
using (Pen tabPageBorderPen = new Pen(TabPageBorderColor, TabPageBorderWidth))
{
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
for (int i = 0; i < TabPages.Count; i++)
{
Rectangle tabRect = GetTabRect(i);
bool isSelected = i == this.SelectedIndex;
tabRect.Inflate(new Size(-TabBorderWidth, -TabBorderWidth));
// Altera a cor de fundo e a cor da fonte da aba selecionada
Color tabBack = isSelected ? Color.LightSkyBlue : TabBackColor;
Color tabFontColor = isSelected ? Color.White : Color.Black;
using (SolidBrush tabBackBrush = new SolidBrush(tabBack))
using (SolidBrush tabFontBrush = new SolidBrush(tabFontColor))
{
e.Graphics.FillRectangle(tabBackBrush, tabRect);
e.Graphics.DrawRectangle(borderPen, tabRect);
e.Graphics.DrawString(TabPages[i].Text, TabFont, tabFontBrush, tabRect, stringFormat);
}
RectangleF tabPageContentRect = GetTabRect(i);
tabPageContentRect.Y += tabRect.Height;
tabPageContentRect.Height -= tabRect.Height;
// Calcula o retângulo para o conteúdo da TabPage (excluindo a área da aba)
RectangleF tabPageRect = new RectangleF(
tabPageContentRect.X + 2, tabPageContentRect.Y + 2,
tabPageContentRect.Width - 4, tabPageContentRect.Height - 4);
// Desenha um retângulo em volta da página das abas
int alturaTab = this.ItemSize.Height;
e.Graphics.DrawRectangle(tabPageBorderPen, new Rectangle(1, alturaTab + 1, Width - 3, Height - alturaTab - 3));
}
}
using (Pen controlBorderPen = new Pen(SFTabControlBorderColor, ControlBorderWidth))
{
e.Graphics.DrawRectangle(controlBorderPen, new Rectangle(0, 0, Width - 1, Height - 1));
}
}
#endregion
}
}
Jean Carlos
Curtir tópico
+ 0
Responder
Posts
17/11/2023
Arthur Heinrich
Não conheço o Visual Studio, mas, o componente é da API do Windows.
No Delphi, todo componente possui duas propriedades especiais:
Owner: Componente ao qual o componente pertence. Por exemplo o form ou um panel.
Ao destruir um componente, todos os componentes pertencentes a ele (que possuem como owner o componente que está sendo destruído), são destruídos junto.
Parent: O "Parent Control" é responsável pela exibição do componente. Você deve indicar onde o seu componente será exibido. No seu caso, como deve ser exibido em um TabSheet, informe este componente, para que seja exibido nele.
No Delphi, todo componente possui duas propriedades especiais:
Owner: Componente ao qual o componente pertence. Por exemplo o form ou um panel.
Ao destruir um componente, todos os componentes pertencentes a ele (que possuem como owner o componente que está sendo destruído), são destruídos junto.
Parent: O "Parent Control" é responsável pela exibição do componente. Você deve indicar onde o seu componente será exibido. No seu caso, como deve ser exibido em um TabSheet, informe este componente, para que seja exibido nele.
Responder
Clique aqui para fazer login e interagir na Comunidade :)