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
}
}
Jean Carlos

Jean Carlos

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.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar